计算机基础知识61

JsonResponse 功能例子

你自己写一个类,实现JsonResponse 功能,不需要传safe=False,无论字典或列表,都能完成序列化返回给前端

1

响应头例子

四种情况,在响应头返回数据  xx=xx
 # 第一种情况 JsonResponse

def show(request):
# 方式一
    return JsonResponse({'fjw': 123}, headers={'xx': 'xx'})
# 方式二 # 后面headers可以同时用  也可以删掉
    res = JsonResponse
    res['name'] = 'glwnnb'
    return res

# 第二种情况 HttpResponse

def show(request):
# 方式一
    res = HttpResponse('123')
    res.set_cookie('name', 'genglianwen')
# 方式二
    res = HttpResponse('123')
    res['name'] = 'glwnb'
    return res

# 第三种情况 Redirect

def show(request):
    res = redirect("/admin/")
    res['lw'] = 'i am geng lianwen'
    return res

# 第四种情况 render

def show(request):
    res = render(request, 'up_image.html')
    res['name'] = 'glw'
    return res
t = Template('<html><body>:<h1>{{name}}nb </h1></body></html>

面向对象绑定给类方法例子

绑定给类的方法,类来调用,对象可以调用吗?如何用

# 加一个装饰器@classmethod,把方法的第一个形参改为cls

  会把类自动当成第一个参数传递给方法的第一个形参cls

可以调用

class MyClass:
    @classmethod
    def index(cls):     # cls:就是类
        print("hello index")
obj = MyClass()
obj.index()    # hello index

面向对象绑定给对象方法例子

绑定给对象的方法,对象来调用,类可以调用吗?如何用

#  默认情况下,在类内部写方法是绑定给对象的,就有对象来调用,就会自动来传递参数

         绑定给对象的方法,类也能调用,但是方法中需要传递几个就要传几个,包括self

class Student():
    school = 'SH'
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender
 
    def tell_info(self, username, password):
        print("name:%s  %s %s" % (self.name, username, password))
stu = Student('ly', 20, 'male')
stu.tell_info('kevin', 123)             # self自动来传递参数
Student.tell_info(stu , 'kevin' ,123)   # 需要传递几个就要传几个,包括self

上传文件例子

写个图片上传功能,图片保存在根路径media文件夹下

        上传成功直接在前端显示出上传的图片

setting.py
import os
TEMPLATES = ['DIRS': [os.path.join(BASE_DIR,'templates')]]

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR,'media')
urls.py
from django.contrib import admin
from django.urls import path,re_path
from django.conf.urls import static
from django.conf import settings
from django.views.static import serve
from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('tupian/', views.FileView.as_view()),
    re_path('media/(?P<path>.*)', serve, {'document_root': settings.MEDIA_ROOT}),
]
views.py
from django.shortcuts import render, HttpResponse
# Create your views here.
from django.views import View

class FileView(View):
    def get(self, request):
        return render(request, 'tupian.html')
    def post(self, requst):
        # 拿出文件
        # {'mytupian': [<InMemoryUploadedFile: 1701262155217.jpg (image/jpeg)>]}
        my_tupian = requst.FILES.get('mytupian')
        # print(my_tupian.name)
        import os
        basr_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        dizi = os.path.join(basr_dir, 'media', my_tupian.name)
        with open(my_tupian.name, 'wb') as f:
            with open(dizi, 'wb') as f1:
                for line in my_tupian:
                    f1.write(line)
        return render(requst,'tupian.html',locals())
tupian.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data">
    <input type="file" name="mytupian">
    <br>
    <input type="submit" value="提交">
</form>
{#前端展示#}
<div>
    {% if my_tupian %}
        <img src="../media/{{ my_tupian.name }}" alt="">
    {% endif %} 
</div>
</body>
</html>

for标签例子

建个表---》插入100条数据---》写个页面,for循环把100条数据显示在页面上

2、

3、

过滤器例子

   (能做就做)自定义一个过滤器---》实现 

 数据有个表---》content字段---》别人存入了一些敏感词
        你这个大[傻逼]
        它[妈的]
        
    模板显示:content 
    {{content|pingbi}}
    你这个大**
    它**
    
    高级一些:关键词放到一个列表中,可以随时增加,不需要重启项目---》数据可以放在数据库中

2、

3、

视图层补充:响应对象

# 响应的本质都是 HttpResponse,是字符串    

render:放个模板,模板语法是在后端执行的
redirect:重定向,字符串参数不是是空的,状态码是 3开头
JsonResponse:json格式数据,如果想往响应头中写数据,需要传headers={'xx':'xx'}
js代码:在客户端浏览器里执行的

# JsonResponse源码分析:

return JsonResponse({name:lqz,age:19})     
# 触发  JsonResponse的__init__--->{name:lqz,age:19}给了data
def __init__(self, data, encoder=DjangoJSONEncoder, safe=True,json_dumps_params=None, **kwargs):
    # 如果传入的四字典
    # safe是True,后面是False,条件不符合,内部就不会走
    # isinstance(对象, 类) 判断这个对象,是不是这个类的对象
    if safe and not isinstance(data, dict):
        raise TypeError(
            'In order to allow non-dict objects to be serialized set the '
            'safe parameter to False.'
        )
   if json_dumps_params is None: # 条件符合
        json_dumps_params = {}
        # kwargs是字典---》setdefault--》有则修改,无则新增
        kwargs.setdefault('content_type', 'application/json')
        # 核心---》把字典转成json格式字符串,赋值给data
   data = json.dumps(data, cls=encoder, **json_dumps_params)
   # super().__init__ 调用父类的 __init__ 完成实例化---》HttpResponse的对象
   return HttpResponse(data,**kwargs)
   super().__init__(content=data, **kwargs)

        本质是把传入的字典或列表(必须指定safe=False),使用json序列化得到json格式字符串,最终做成HttpResponse返回给前端,如果想给json序列化的时候,传参数,必须使用json_dumps_params字典传入

cbv和fbv

# fbv:基于函数的视图,之前写的全是fbv
# cbv:基于类的视图,后续全是cbv

from django.views import View
class UserView(View):
    # 写方法---》跟请求方式同名的方法
    def get(self,request,*args,**kwargs)
        必须返回四件套

# 路由配置:  path('index/', 视图类名.as_view())     # as_view是类的绑定方法

源码分析:

urls.py
path('index/', index),    # 请求来了,路由匹配成功会执行 index(request,) 
path('index/', UserView.as_view()),

# 请求来了,路由匹配成功:

        1、执行 UserView.as_view()(request)
        2、as_view() 执行结果是 view,本质就是在执行 view(request)

        3、本质在执行  self.dispatch(request, *args, **kwargs)

# 方法,可以加括号调用
def view(request, *args, **kwargs):        
    return self.dispatch(request, *args, **kwargs)

# 去UserViwe类中找----找不到----去父类View中找dispatch,代码如下:

 def dispatch(self, request, *args, **kwargs):
        # request当次请求的请求对象,取出请求方式【假设是get请求】,转成小写 'get'
        # http_method_names = ['get', 'post', 'put']
        # 条件成立,执行if内部代码
        if request.method.lower() in self.http_method_names:
            #getattr:反射---》通过字符串去对象中取属性或方法
            # self是谁的对象? 是View这个类的对象,这个是视图类UserView的对象
            # 取出来的handler 是 UserView这个类的get方法
            handler = getattr(self, 'get')
        else:
            handler = self.http_method_not_allowed
        # handler是 UserView这个类的get方法
        # get(request)---》触发UserView这个类的get方法---》真正执行原来视图函数的内容
        # 最终返回
        return handler(request, *args, **kwargs)
"""总结:写cbv,只需要在视图类中写跟请求方式同名的方法即可--》不同请求方式,就会执行不同的方法"""

类中的self

class Animal:
    def run(self):
        # 这个self,是谁调用,就是谁
        print(type(self))
        print(self.name, '走路')
class Person(Animal):
    def __init__(self, name):
        self.name = name
class Dog(Animal):
    def __init__(self, name,age):
        self.name = name
        self.age=age
# p = Person('lqz')
# p.run()  #
dog=Dog('小奶狗',6)
dog.run()

###  self 是谁调用。self就是谁,不能只看是哪个类
### 以后看到self.方法的时候,不要只从当前类,或父类中找,应该先确定当前self是谁,然后从这个对象的类根上开始找

上传文件

## 关于模板查找路径是配置文件中

setting.py/TEMPLATES
'DIRS': [os.path.join(BASE_DIR, 'templates')]

## python

class FileView(View):
    def get(self,request):
        return render(request,'file.html')
    def post(self,request):
        # 拿出文件对象
        my_file=request.FILES.get('myfile')
        print(type(my_file)) #django.core.files.uploadedfile.InMemoryUploadedFile 跟之前用的文件对象不一样但是,它应该继承了文件
        from django.core.files.uploadedfile import InMemoryUploadedFile
        # 1 保存  2 取出文件名字
        # my_file.save() #找了一顿,没有,所以不能使用快捷保存方式,需要自己写保存
        print(my_file.name) # 3-回顾django.md
        # 自己写保存,放在项目根路径下
        with open(my_file.name,'wb') as f:
            for line in my_file:
                f.write(line)
        return HttpResponse('上传成功')
# html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

</head>
<body>
<form action="" method="post" enctype="multipart/form-data">
    <input type="file" name="myfile">
    <br>
    <input type="submit" value="提交">
</form>
</body>
</html>

模版层

1、介绍:

        模板在浏览器中是运行不了的,因为它有 模板语法,浏览器解析不了模板语法

        必须在后端渲染完成,变成纯粹的html,css,js

        模板语法:django template language,在后端会被渲染的类python语法

2、django模板修改的视图函数:

from django.template import Template,Context
now=datetime.datetime.now()
# 内部打开了这个模板---》读出所有内容,实例化得到了t对象
t=Template('<html><body>现在时刻是:<h1>{{current_date}}</h1></body></html>')
# #t=get_template('current_datetime.html')
c=Context({'current_date':str(now)})
html=t.render(c)
return HttpResponse(html)
#另一种写法(推荐) 
import datetime
now=datetime.datetime.now()
return render(req, 'current_datetime.html', {'current_date':str(now)[:19]})  

 # 总结:咱们之前这么写

render(request,'模板名字',context={key:value,key1:value})
本质是:
    t=Template('<html><body>现在时刻是:<h1>{{current_date}}</h1></body></html>')
    c=Context({'current_date':str(now)})
    html=t.render(c) # 返回是字符串
    HttpResponse(html)

3、页面静态化#######

def index(request):
   1 判断 cache文件夹下有没有 index.html  纯静态页面
   2 如果没有:干下面的事
    books = Book.object.all()
    t = Template('<html><body>现在时刻是:<h1>{{current_date}}</h1></body></html>')
    # #t=get_template('current_datetime.html')
    c = Context({'books':books})
    html = t.render(c)
   #保存到某个文件中  cache文件夹下 index.html 
   3 如果有那个文件,打开文件---》HttpReponse
    books=Book.object.all()
    return render(request,'index.html',{books:books})

4、模板语法###

变量:{{ 变量名 }}        #字典/列表/对象通过.拿到属性或方法

字典:dic.name--->这不是python语法    dic['name']    dic.get('name')
列表:list.2--->这不是python语法      list[0]
对象:person.name---->是python语法
person.run---->不是python语法,会自动加括号,把run的返回值放在模板中,不支持传参数
1 深度查询 用句点符
2 过滤器
3 标签:{{% % }}

5 内置过滤器####

pythohn:render(request,'index.html',{now:当前时间对象})
html:{{ now | date:"Y-m-d H:i:s" }}
safe:把标签字符串 渲染成标签
'<a href=""></a>'  

# 模板语法l是不存在xss(跨站脚本攻击)攻击的
        {{s}}   不会渲染成标签,没有xss攻击
        我们知道s是安全的,我们可以使用safe标签,把它渲染成真正的标签

6、标签for  if ...  for和if用法是重点

for:
def test(request):
    names=['egon','kevin']
    return render(request,'test.html',locals())

<hr>
{% for name in names %}
    <p>{{ forloop.counter0 }} {{ name }}</p>
{% endfor %}
<!--
输出结果为:
    0 egon
    1 kevin
<hr>
if:
{% if num > 100 or num < 0 %}
    <p>无效</p>
{% elif num > 80 and num < 100 %}
    <p>优秀</p>
{% else %}
    <p>凑活吧</p>
{% endif %}

7、模板导入 include

        写好一段前端代码块,以后别的页面要用,直接 {% include 'little.html' %}

### python代码:
def index(request):
    return render(request, 'index.html', {'name': '彭于晏'})
little.html
<div>
    <h1>我是广告</h1>
    <p>亚洲最大同性交友平台</p>
    <p>名字是:{{ name }}---诚信交友</p>
</div>
导入:
<div>
    {% include 'little.html' %}  
</div>

# 总结:
    -1 {{变量}}  {{变量.取值}}
    -2 {%for%}
    -3 {%if%}
    -5 内置过滤器 :data,length。。。
    -6 include
    -7 extends使用

今日思维导图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/203758.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据通信——OSPF路由控制实验

实验需求 我们采用OSPF完成路由的控制&#xff0c;首先连接如下拓扑&#xff1a; 所有设备均属于area 0&#xff0c;网段及环回口配置如上图所示。 实验目的&#xff1a;R4和R1的环回口通信路径为R4——R2——R1若R2出现问题&#xff0c;自动切换到R3路径。 实验配置 1&am…

C++ CryptoPP使用AES加解密

Crypto (CryptoPP) 是一个用于密码学和加密的 C 库。它是一个开源项目&#xff0c;提供了大量的密码学算法和功能&#xff0c;包括对称加密、非对称加密、哈希函数、消息认证码 (MAC)、数字签名等。Crypto 的目标是提供高性能和可靠的密码学工具&#xff0c;以满足软件开发中对…

05-React路由(Router 5版本)

React路由背景介绍 背景介绍 多页面应用与SPA单页面应用 多页面应用 先说传统的多页面&#xff0c;需要写多个子页面 点击导航栏&#xff0c;整个页面都会刷新&#xff0c;但是实际上我只想刷新一小块的内容&#xff0c;其他东西变化不大 而且这个单页面&#xff0c;每次切…

风光互补路灯简介及配置方案

风光互补路灯是一种新型的路灯系统&#xff0c;使用太阳能和风能进行发电&#xff0c;以供给路灯照明。它结合了太阳能光伏板和垂直轴风力发电机&#xff0c;可以在一天内不同的时间段和天气条件下&#xff0c;通过自然资源发电&#xff0c;实现能源的自给自足和环境保护。 风…

鸿蒙系统扫盲(三):鸿蒙开发用什么语言?

1.两种开发方向 我们常说鸿蒙开发&#xff0c;但是其实鸿蒙开发分为两个方向&#xff1a; 一个是系统级别的开发&#xff0c;比如驱动&#xff0c;内核和框架层的开发&#xff0c;这种开发以C/C为主 还有一个是应用级别的开发&#xff0c;在API7以及以下&#xff0c;还是支持…

attention中Q,K,V的理解

第一种 1.首先定义三个线性变换矩阵&#xff0c;query&#xff0c;key&#xff0c;value&#xff1a; class BertSelfAttention(nn.Module):self.query nn.Linear(config.hidden_size, self.all_head_size) # 输入768&#xff0c; 输出768self.key nn.Linear(config.hidde…

Open3D 最小二乘拟合二维直线(直接求解法)

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。爬虫网站自重。 一、算法原理 平面直线的表达式为: y = k x + b

台灯选什么样的对眼睛好?分享适合备考使用的护眼台灯

随着生活条件的逐渐提升&#xff0c;台灯的需求也越来越大&#xff0c;不管在生活中还是工作中&#xff0c;台灯成为了必不可少的照明工具。而且现在很多孩子都是存在视力问题的&#xff0c;这也让不少家长纷纷开始重视起来&#xff0c;为了更好的保护孩子的眼睛选择更为专业的…

数据探索:五款免费数据可视化工具概览

数据可视化是解读和传达数据的重要方式&#xff0c;而现在有许多免费的工具可供选择&#xff0c;让您在探索数据时更轻松、更有趣。以下是五款推荐的免费数据可视化工具&#xff1a; Tableau Public&#xff1a; Tableau Public是一款功能强大的可视化工具&#xff0c;能够创建…

SpringBoot项目打成jar包后,上传的静态资源(图片等)如何存储和访问

1.问题描述&#xff1a; 使用springboot开发一个项目&#xff0c;开发文件上传的时候&#xff0c;通常会将上传的文件存储到资源目录下的static里面&#xff0c;然后在本地测试上传文件功能没有问题&#xff0c;但是将项目打成jar包放到服务器上运行的时候就会报错&#xff0c…

指标管理必知的真相:订单事实表里没有原子指标

上篇文章「一个问题鉴定指标管理真实力&#xff1a;订单表里有原子指标吗&#xff1f;」写完以后&#xff0c;分享到一个群里&#xff0c;有同行回复&#xff1a;有&#xff0c;比如订单金额。 看到回复&#xff0c;我脑子突然就断电了&#xff0c;好像对诶&#xff01;确实是…

借助 DPM 代码扫描的力量解锁医疗设备的可追溯性

在当今的医疗保健系统中&#xff0c;医疗设备的可追溯性变得比以往任何时候都更加重要。为了增强现代医疗保健领域的可追溯性和安全性&#xff0c;UDI 条形码充当唯一设备标识的标准&#xff0c;为医疗设备提供唯一标识符。 DataMatrix 代码&#xff08;或直接零件标记代码&am…

Python爬取某电商平台商品数据及评论!

目录 前言 主要内容 1. 爬取商品列表数据 2. 爬取单个商品页面的数据 3. 爬取评论数据 4. 使用代理ip 总结 前言 随着互联网的发展&#xff0c;电商平台的出现让我们的消费更加便利&#xff0c;消费者可以在家里轻松地购买到各种商品。但有时候我们需要大量的商品数据进…

网络和Linux网络_7(传输层)UDP和TCP协议(端口号+确认应答+超时重传+三次握手四次挥手)

目录 1. 重看端口号 1.1 端口号的概念 1.2 端口号的划分 2. 重看UDP协议 2.1 UDP协议格式 2.2 UDP的特点 3. 重看TCP协议 3.1 TCP协议格式 3.2 TCP的解包分用 3.3 TCP的可靠性及机制 3.3.1 确认应答ACK机制 3.3.2 超时重传机制 3.3.3 连接管理机制&#xff08;三次…

内存泄漏检测工具valgrind

示例&#xff1a; class Person { public:Person(int age){//将年龄数据开辟到堆区m_Age new int(age);}//重载赋值运算符 写法2 此代码在linux测试Person& operator(Person& p){*m_Age *p.m_Age; //通过linux下valgrind工具检测&#xff0c;无内存泄漏情况。//此语…

LVS+Keepalived实验

实验前准备 主DR服务器&#xff1a;(ens33)192.168.188.11 ipvsadm、keepalived (ens33:0)192.168.188.188 备DR服务器&#xff1a;(ens33)192.168.188.12 ipvsadm、keepalived (ens33:0)192.168.188.188 Wbe服务器1&#xff1a;(ens33)192.168.188.13 (lo:0)192.168.188.188 W…

UG\NX二次开发 获取对象上属性的锁定状态UF_ATTR_ask_locked

文章作者&#xff1a;里海 来源网站&#xff1a;里海NX二次开发3000例专栏 感谢粉丝订阅 感谢 2301_80435318 开发 订阅本专栏&#xff0c;非常感谢。 简介 设置对象上属性的锁定状态UF_ATTR_set_locked&#xff0c;需要先在“用户默认设置”中勾选“通过NX Open锁定属性”&…

【攻防世界-misc】[简单] 凯撒大帝在培根里藏了什么

1.下载文件&#xff0c;打开后是这样子的 2.根据题目提示说是有凯撒密码和培根密码&#xff0c;因为文件内容为AB形式&#xff0c;不符合凯撒条件&#xff0c;所以先用培根解&#xff0c;将文件内容复制&#xff0c;CTF在线工具-CTF工具|CTF编码|CTF密码学|CTF加解密|程序员工具…

虚拟机安装centos7系统后网络配置

一.桥接网络和nat网络的区别1&#xff0c;桥接模式&#xff08;如果外部访问虚拟机&#xff0c;最好选这个&#xff09; 通过使用物理机网卡 具有单独ip,但是需要手动配置。 在bridged模式下&#xff0c;VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机&#xff0c;它…

数字孪生智慧园区:企业与政府合作的共赢之选

随着科技的快速发展和数字化转型的推动&#xff0c;数字孪生技术正逐渐成为智慧城市和园区建设的重要方向。数字孪生智慧园区&#xff0c;以数字孪生技术为驱动&#xff0c;通过对园区实体和虚拟环境的全面感知和深度理解&#xff0c;为园区管理者和入驻企业提供智能化决策支持…