Django复习篇

2022/6/12 23:20:13

本文主要是介绍Django复习篇,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Django复习篇

回忆Django请求生命周期流程图
img

解释图:
浏览器>> 发送请求(Http请求) >> web服务网关接口(django默认的wsgiref模块不能承受高并发,最大只有1000左右) >> 中间件 >> 缓存数据库(返回给中间件已经缓存过的数据) >> urls.py(路由层) >> views.py(视图层) >> templates(模板层:存放html静态文件) models.py(模型层:存放架接数据库)>> 数据库(返回给模型层需要的数据)

1.浏览器发送网络请求

HTTP协议

http(超文本传输协议),默认端口80(服务端的端口,客户端的端口动态分配)。
规定了服务端与浏览器之间的数据交互格式及其他事项
"""
如果服务端遵循HTTP协议 就可以被浏览器正常访问并展示内容
如果服务端不遵循HTTP协议 浏览器就不会正常访问和展示 但是不
影响服务端
如果这个应用特别火爆 那么完全可以让用户下载专属的客户端
(app)
"""

HTTP协议四大特性

"""1.基于请求、响应"""
服务端永远不会主动给客户端发消息,必须是客户端先请求服务端被动响应
'''2.基于TCP/IP作用于应用层之上的协议'''
应用层协议:HTTP、HTTPS、FTP...
'''3.无状态'''
服务端不保存客户端状态(纵使见她千百遍 我都当她如初见)
'''4.超链接'''
	'''keep-alive'''
  	不保持客户端与服务端之间的链接导通

HTTP协议的数据格式

'''请求格式:客户端给服务端发送消息应该遵循的数据格式'''
1.请求首行(请求方式 协议版本)
2.请求头(一堆k:v键值对)  就类似于开路先锋 携带了一些服务端可以提前知道的信息
3.换行(/r/n)(如果请求头里没有内容 那就是 /r/n/r/n)
4.请求体(发送post请求 携带的数据(如密码、身份证号)都会放在请求体中)

'''响应格式:服务端给客户端发送消息应该遵循的数据格式'''
1.响应首行(响应状态码  协议版本)
2.响应头(一大堆K:V键值对)
3.换行(/r/n)
4.响应体(给浏览器展示给用户看的页面内容)

HTTP协议的响应状态码

用数字来表示一串中文意思(简化理解)
1XX:服务端成功接收到了你的数据正在处理,你可以等待或者继续发送
2XX:200 OK  表示请求成功	服务端给出了响应
3XX:301/302	表示重定向(想访问A页面但是自动跳转到了B页面)
4XX:403请求不合法(权限不够)	404请求资源不存在
5XX:都是服务端错误	与客户端无关(代码bug、机房炸了)
在工作中还会自定义状态码(因为默认的不够)
自定义状态码一般从10000开始
ps:以后写后端要给前端提供一个手册。可以使用工具:聚合数据

http请求常见的请求方法和使用

GET :向服务器获取资源,比较常用的请求方法

POST:向服务器提交数据而发送的请求,比较常用的请求方法

PUT :  用于更新请求,比如更新个人信息、商品信息更新

PATCH: PUT方法的补充,更新指定资源的部分数据

DELETE: 删除指定资源

HEAD:  和GET类似,返回的响应中没有具体内容,用于获取报头

OPTIONS: 获取服务器支持的http请求方法,服务器性能、跨域检查等

CONNECT: 让服务器代理用户去访问其他网页,再把数据返回给用户, 类似中介

TRACE:   回显服务器收到的请求,主要用于测试或诊断

2.web服务网关接口

	wsgiref		处理请求和响应   自身的并发量很低!!!
    uwsgi	上线之后切换该软件 并发量提升明显

3.django中间件

默认七个中间件
自定义五个方法
重要'process_request'
	请求来的时候会从上往下一次执行配置文件中注册了的中间件里面的process_request方法,如果没有则直接跳过
如果该方法自己返回了HttpResponse对象,那么请求不在继续往后直接返回相应的数据
重要'process_response'
    响应走的时候会从下往上依次执行配置文件中注册了的中间件里面的process_response方法,如果没有则直接跳过
如果该方法自己返回了HttpResponse对象,那么响应会替换成改HttpResponse对象数据,而不再是视图函数想要返回给客户端的数据 
'process_view'
	路由匹配成功之后执行视图之前从上往下执行配置文件中注册了的中间件里面的process_view方法
process_template_response
	视图函数执行完毕之后返回的对象中含有render属性对应一个'render方法'
    则会从下往上执行配置文件中注册了的中间件里面的process_template_response方法
'process_exception'
	视图函数执行过程中报错并在返回响应的时候会从下往上执行配置文件中注册了的中间件里面的process_exception

路由层

1.版本不同使用的方法不一样 url() path()
	从2.x以后,建议使用path,是一个准确路径
	如果使用正则方式,建议使用re_path,用法与1.x的url完全一致
eg:
	from django.urls import path,re_path
    str:匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
    int:匹配正整数,包括0
    slug:匹配字母、数字、下划线以及横杠组成的字符串
    uuid:匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00
    path:匹配任何非空字符串,包含了路径分隔符(/),不能用"?"
2.路由匹配
3.无名、有名分组
实现匹配这种路径:
http://127.0.0.1:8000/jason/p/4444.html
    path('<str:name>/p/<int:id>.html', views.article),
    re_path(r'^(?P<name>.*?)/p/(?P<id>\d+).html$', views.login)
	url(r'^(?P<name>.*?)/p/(?P<id>\d+).html$', views.login)
4.反向解析
5.无名、有名分组反向解析
	'无名分组反向解析'
    	步骤1:给对应关系起别名
            	url(r'^func666/(\d+)/',views.func,name='func_view')
        步骤2:使用反向解析获取结果
            前端:
    {% url 'func_view' 123 %}  # func666/123/
后端:
    from django.shortcuts import reverse
    reverse('func_view',args=(666,))  # func666/666/
	'有名分组反向解析'
    # 步骤1:给对应关系起别名
    url(r'^func666/(?P<id>\d+)/',views.func,name='func_view')
    # 步骤2:使用反向解析获取结果
    '''无法明确括号内正则表达式的内容 需要人为指定'''
    前端:
        {% url 'func_view' 123 %}  # func666/123/
        {% url 'func_view' id=123 %}  # func666/123/
    后端:
        from django.shortcuts import reverse
        reverse('func_view',args=(666,))  # func666/666/
        reverse('func_view',kwargs={'id':1})  # func666/1/
疑问:无名有名反向解析中的手动传值 这个值在实际工作中到底可以是什么
一般情况下这个值可以是数据的主键值、页面的页码、区域的编号等
    
6.路由分发
  from django.conf.urls import url, include
  url(r'^app01/',include('app01.urls')),
  url(r'^app02/',include('app02.urls'))
7.名称空间
1.不同的应用使用了相同的别名,那么反向解析是否自动识别
index_view	app01/index/
index_view	app02/index/
2.验证发现默认情况下是不会自动识别应用前缀的 如何解决反向解析问题
方式1    	
		应用反向解析自动提示
      	reverse('app01:index_view')
        reverse('app02:index_view')
        {% url 'app01:index_view' %}
        {% url 'app02:index_view' %}
方式2
	只需要确保反向解析的别名在整个项目中不重复即可!!!
    	可以在别名的前面加上应用名的前缀
      	url(r'^index/',views.index,name='app01_index_view')
        url(r'^index/',views.index,name='app02_index_view')

视图层

django小白必会三板斧

# 与浏览器打交道的视图函数都应该有返回值 常见的就是下列三个
HttpResponse
    主要用于返回字符串类型的数据
render
    主要用于返回html文件 并且支持模板语法(django自己写的)
redirect
主要用于重定向 括号内可以写其他网站的全称 也可以自己网站的后缀

JsonResponse对象

# views视图代码:
def jsonres(request):
    user_dict = {'name': 'jason', 'pwd': 123, 'hobby': '好好学习'}
    return JsonResponse(user_dict, json_dumps_params={'ensure_ascii': False})
# json_dumps_params={'ensure_ascii': False} 用来解决中文乱码问题
# safe:转换除字典以外的格式,需要设置safe=False
eg:    
    u_list = [1, 2, 3, 4, 5]
    return JsonResponse(u_list, safe=False)


"""为什么使用JsonResponse还不是原始的json模块"""
django对json序列化的数据类型的范围做了扩充
基本数据类型都可以序列化
回忆之前我们自己扩展的序列化方法
'FBV与CBV'
https://blog.csdn.net/weixin_46407419/article/details/124855147

6.模板层

模板语法
    '''传值方式1:指名道姓的传''' 
    return render(request, 'ab_temp.html', {'name':name})
    '''传值方式2:打包传值'''
    locals() 将当前名称空间中所有的名字全部传递给html页面
    基本数据类型都可以
# 函数名
  	模板语法会自动加括号执行并将函数的返回值展示到页面上
    不支持传参(模板语法会自动忽略有参函数)
# 文件名
  	直接显示文件IO对象
# 类名
  	自动加括号实例化成对象
# 对象名
  	直接显示对象的地址 并且具备调用属性和方法的能力
    
'''
django模板语法针对容器类型的取值 只有一种方式>>>:句点符
	既可以点key也可以点索引  django内部自动识别
  	{{ data1.info.pro.3.msg }}
'''

    
    
过滤器
    '{{ 数据对象|过滤器名称:参数 }}  过滤器最多只能额外传输一个参数'
    (django模板语法提供了60+过滤器 我们了解几个即可)
    <p>统计数据的长度:{{ s1|length }}</p>
    <p>算数加法或者字符串加法(拼接):{{ n1|add:100 }}、{{ s1|add:'hello baby' }}</p>
    <p>将数字转成合适的文件计量单位:{{ file_size|filesizeformat }}、{{ file_size1|filesizeformat}}</p>
    <p>判断当前数据对象对应的布尔值是否是False>>>:{{ s1|default:'前面的值对应的布尔值是False'  }}、{{ f|default:'前面的值对应的布尔值是False'  }}</p>
    {#这个方法如果是true则直接返回对应的字符串,是false则返回default后面的值#}
    <p>时间格式化:{{ c_time|date:'Y-m-d' }}</p>
    <p>索引切片:{{ s1|slice:'0:3' }}</p>
    <p>按照空格截取指定个数的文本{{ s2|truncatewords:4 }}</p>
    <p>按照字符截取指定个数的文本(包含三个点):{{ s2|truncatechars:4 }}、{{ s1|truncatechars:6 }}</p>
    <p>移除指定的字符:{{ s3|cut:'|' }}</p>
    <p>是否取消转换:{{ tag1 }} {{ tag1|safe }}</p>
    {#需要把后端的标签语法进行渲染需要加上safe告诉程序这个代码是安全的不必转义,也可以通过后端来实现#}
    <p>通过后端实现转换:{{ res }}</p>
标签
	{% 名字 ...%}
	{% end名字 %}
    inclustion
模板的继承与导入
        模板的导入
        	{% include 'menu.html' %}
        模板的继承
        	{#1.先在模板中通过block划定将来可以被修改的区域#}
            {% block content %}
                <h1>主页内容</h1>
            {% endblock %}
            {# 2.子板继承模板 #}
            {% extends 'home.html'%}
            {# 3.对引入的模板块进行从写 #}
            {% block demo %}
            {# 4.子页面也支持使用父页面的功能 #}
            {{ block.super }}

模型层

orm语法
    	查询关键字
        	all()
            filter()
            get()
            values()
            values_list()
            exclude()
            order_by()
            distinct()
            count()
            reverse()
            first()
            last()
            update()
            delete()
            create()
        神奇的双下划线查询
        跨表查询
        	基于对象的跨表
            基于双下划綫的跨表
        分组与聚合
        F与Q查询
        查询优化关键字
   常见字段
   常见参数

8.ajax语法

 $("#d1").click(function (){
        // 需要利用内置js内置对象FormData
        let myFormData = new FormData();
        // 对象添加普通数据
        myFormData.append('name',$('#name').val())
        myFormData.append('pwd',$('#pwd').val())
        // 对象添加文件数据
        myFormData.append('file',$('#file')[0].files[0])
        // 发送ajax请求
        $.ajax({
            url:'',
            type:'post',
            data:myFormData,
            // 携带文件必须要指定的两个参数
            contentType:false,
            processData:false,
            
            success:function (args){
                // 处理异步回调返回的结果
            }
        })
    })

9.forms组件与modelform

# views.py 代码

from django import forms
class MyForm(forms.Form):
    # 用户名至少三个字符最多八个字符
    username = forms.CharField(min_length=3,max_length=8)
    # 年龄最小不能小于0 最大不能超过150
    age = forms.IntegerField(min_value=0,max_value=150)
    # 邮箱必须符合邮箱格式(@关键符号)
    email = forms.EmailField()

modelform

class MyUser(forms.ModelForm):
    class Meta:
        model = models.User  # 指定关联的表
        fields = '__all__'  # 所有的字段全部生成对应的forms字段
        labels = {
            'name': '用户名',
            'age': '年龄',
            'addr': '地址',
            'email': '邮箱'
        }
        widgets = {
            "name": forms.widgets.TextInput(attrs={"class": "form-control"}),
        }
        

10.csrf校验

CSRF(Cross-site request forgery)简称:跨站请求伪造,攻击者通过伪造用户的浏览器的请求,向访问一个用户自己曾经认证访问过的网站发送出去,使目标网站接收并误以为是用户的真实操作而去执行命令。常用于盗取账号、转账、发送虚假消息等。攻击者利用网站对请求的验证漏洞而实现这样的攻击行为,网站能够确认请求来源于用户的浏览器,却不能验证请求是否源于用户的真实意愿下的操作行为。

"""
csrf_exempt 
    忽略csrf校验
csrf_protect
    开启csrf校验
"""
使用方法:先导入两个模块
from django.views.decorators.csrf import csrf_exempt,csrf_protect

11.cookie与session

COOKIE是什么?

Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息。

Cookie的原理

cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了。

COOKIE往哪去?

cookie的归宿是客户端,由服务端生成后,发送给客户端;它是存放在客户端的硬盘上的。

cookie的本质

指代服务端让客户端保存的数据(存储在客户端上与用户信息相关的数据)
'''简单的记忆:cookie就是存在客户端的东西'''

session简介

早期的cookie是直接存储的用户明文相关信息 不安全用户登录成功之后 服务端生成一个随机字符串 返回给客户端保存之后客户端每次发请求携带该随机字符串 服务端获取之后比对后台数据
'''
eg:
      服务端
      	随机字符串1   用户数据1
        随机字符串2	 用户数据2
        随机字符串3	 用户数据3
  		客户端
      	随机字符串1、随机字符串2、随机字符串3
'''

session本质

指代服务端保存的跟用户信息相关的数据
'''简单的记忆:session就是存在服务端的东西'''


"""
1.session的工作必须依赖于cookie
2.客户端也有权拒绝保存数据
"""
ps:针对身份标识问题有很多方式  cookie和session是最基本的
  	token、jwt...

12.auth认证

# django提供给你快速完成用户相关功能的模块
	用户相关功能:创建、认证、编辑...
# django也配套提供了一张'用户表'
	执行数据库迁移命令之后默认产生的auth_user
# django自带的admin后台管理用户登录参考的就是auth_user表
	创建admin后台管理员用户:run manage.py task>>:createsuperuser
  自动对用户密码进行加密处理并保存

auth扩展表字段

# 方式1:编写一对一表关系(了解)
# 方式2:类继承(推荐)
from django.contrib.auth.models import AbstractUser
class Users(AbstractUser):
    # 编写AbstractUser类中没有的字段 不能冲突!!!
    phone = models.BigIntegerField()
    addr = models.CharField(max_length=32)


这篇关于Django复习篇的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程