视图-请求-响应对象-类试图-装饰器-中间件-模板
1. 请求对象request(HttpRequest)
URL-路径参数
未命名参数按定义顺序传递
命名参数按名字传递
(?P<city>[a-z]+) 多个字母,city为变量名
(\d{4}),四位数字
URL-查询字符串
用于get请求,接受形如?k1=v1&k2=v2的查询字符串
可以通过request.GET属性获取,这个方法返回QueryDict对象
def qs(request):
a = request.GET.get('a')
alist = request.GET.getlist('a')
QueryDict对象
这个对象一般用来存储浏览器传递过来的参数
QueryDict 这个字典可以用来处理一个键带有多个值得情况
支持 get( ) 方法的使用,QueryDict.get( key )
一键一值获取的就是当前对应的值(value),一键多值获取最后一个值
一键多值,QueryDict.getlist( key ) 获取这个键对应的所有值的列表
请求体--from-_-json
可以发送请求体数据的请求方式有 POST、PUT、PATCH、DELETE
表单类型 --from
前端发送的表单类型的请求体数据,可以通过request.POST属性获取,返回QueryDict对象,使用get和getlist获取key对应的value值
非表单类型--json
request.body获取最原始的请求体数据,返回bytes类型。
json.loads()方法可以接收str和bytes类型,python3.6及以上
字符串对象转JSON对象
json.loads(请求体)获取请求体中的JSON数据
补充注意:python3.5以及以下版本中, json.loads()方法只能接收str
获取数据:json_bytes = request.body
数据编码解码:json_str = json_bytes.decode()
请求头 -META
request.META属性获取请求头headers中的数据
request.META为字典类型,get("key") 获取指定键的数据
其它属性-请求方法-FILES-请求对象-pash
method:字符串表示请求使用的HTTP方法,常用值包括:'GET'、'POST'。
user:请求的用户对象
path:一个字符串,表示请求的页面的完整路径,不包含域名和参数部分
encoding:一个字符串,表示提交的数据的编码方式
FILES:一个类似于字典的对象,包含所有的上传文件
2. 响应对象HttpResponse-自定义-json-重定向
自定义响应对象
import django.http from HttpResponse
content:表示返回的内容。
status:返回的HTTP响应状态码。(状态码范围:100-599)
content_type:指定返回数据的的MIME类型。
HttpResponse对象当做字典进行响应头键值对的设置
自定义响应头Itcast, 值为Python
response['Itcast'] = 'Python'
补充:返回数据类型与数据实际类型不符,接受方将会无法正确解析
了解:HttpResponse--子类
from django.http import HttpResponseNotFound
HttpResponseRedirect 301 重定向
重定向时,请求是get请求,重定向时,URL注意以"/"开头,
否则视为从当前url开始的子路由,即拼接
HttpResponsePermanentRedirect 302
HttpResponseNotModified 304
HttpResponseBadRequest 400
HttpResponseNotFound 404
HttpResponseForbidden 403
HttpResponseNotAllowed 405
HttpResponseGone 410
HttpResponseServerError 500
JsonResponse--返回json数据
return JsonResponse(字典数据)
补充:传入数据不是字典时,需要设置safe=false,默认为True
作用1. 帮助我们将数据转换为json字符串
作用2. 设置响应头Content-Type为 application/json
redirect - - 重定向
redirect(重定向)和我们前面学习的reverse搭配使用
重定向至带有路由参数的url时,进行传参
reverse反解析
补充
3. Cookie--Session
1. Cookie
-设置Cookie
---- HttpResponse.set_cookie(cookie名, value=cookie值,
---- max_age=cookie有效期)
---- max_age 单位为秒,默认为None。
---- 如果是临时cookie,可将max_age设置为None。
- 读取Cookie
---- 可以通过HttpRequest对象的COOKIES属性来读取本次请求携带的cookie值
---- request.COOKIES为字典类型
---- cookie1 = request.COOKIES.get('键')
2. Session存储--Redis
在settings.py文件中,可以设置session数据的存储方式
了解---
session可以保存在数据库、本地缓存( 程序的运行内存中, 全局变量)、文件、redis等
本地缓存:不使用,存在跨机错误
存储在本机内存中,丢失则不能找回,比数据库的方式读写更快
SESSION_ENGINE='django.contrib.sessions.backends.cache'
如果是存放在本地缓存, 一般以cache结尾
跨机访问问题
原因
解决
存储数据库 :不使用,频繁读写影响数据库性能
如果存储在数据库中,需要在项INSTALLED_APPS中安装Session应用
SESSION_ENGINE='django.contrib.sessions.backends.db'
如果是存放数据库, 一般以db结尾
操作Session包括三个数据:键,值,过期时间。
本地缓存-数据库--混合存储
优先从本机内存中存取,如果没有则从数据库中存取
SESSION_ENGINE='django.contrib.sessions.backends.cached_db'
如果是存放数据库,一般以cached_db结尾
常用:Redis
参考文章: http://django-redis-chs.readthedocs.io/zh_CN/latest/#cache-backend
在redis中保存session,需要引入第三方扩展,我们可以使用django-redis来解决
1,安装扩展 pip install django-redis
2. 配置,在settings.py文件中设置
3. 启动redis:redis-server
简单使用
添加数据:request.session['one'] = '1'
获取数据:one = request.session.get('one')
查看信息:redis-cli
使用1号仓库:select 1
查看所有键:keys *
----Session- - 常见操作
通过HttpRequest对象的session属性进行会话的读写操作。
以键值对的格式写session,request.session['键']=值
根据键读取值:request.session.get('键')
清除所有session,在存储中删除值部分:request.session.clear()
清除session数据,在存储中删除session的整条数据。
request.session.flush()
删除session中的指定键及值,在存储中只删除某个键及对应的值。
del request.session['键']
设置session的有效期
request.session.set_expiry(value)
3. ---Redis-复习-
4. 类视图-使用--类视图装饰器
1. 概念-原理-优点
类视图引入缘由
类视图的好处
代码可读性好
使用类视图可以将视图对应的不同请求方式以类中的不同方法来区别定义
类视图相对于函数视图有更高的复用性
如果其他地方需要用到某个类视图的某个特定逻辑,直接继承该类视图即可
类视图原理
通过调用as_view() 函数,函数内创建类对象,通过对请求对象的请求方式进行调用对应的函数进行返回数据
2. 类视图使用
----步骤
1. 导入 使用: from django.views.generic import View
-----或者是: from django.views.generic.base import View
2. 创建类,继承视图父类View
3. 定义视图函数,函数名为对应请求方法的小写
----示例代码
3. 类视图注册url
----步骤
类视图注册: url(r'^register/$',views.RegisterView.as_view()),
说明:注册路由, 路由的第二个参数需要是一个函数, 所以我们会调用系统的 as_view() 方法
----示例代码
4. 类视图--装饰器--了解部分
自定义装饰器
在usls中装饰,装饰所有
示例代码
装饰装饰器method_decorator 多选
作用:直接修饰装饰器函数, 实现单个函数的装饰
1. 导入转换的装饰器方法
2. 使用转换的方法将装饰器转化,为特定请求方法添加装饰器
示例代码
视图类内dispatch函数重写, 实现装饰所有
扩展:装饰类-指定装饰函数名,单选
method_decorator的作用是为函数视图装饰器补充第一个self参数,以适配类视图方法
装饰器拓展-适配类视图方法
如果将装饰器本身改为可以适配类视图方法的,类似如下,则无需再使用method_decorator
---常用:类视图--装饰器--Mixin扩展类
思路:类视图 —> 继承自额外扩展的类 —> 继承自View类(包含有as_view函数)
第一步: 创建一个扩展类, 并且让类视图继承自该类
第二步: 在扩展类中重写 as_view 方法,并且给该方法,添加装饰器.
第三步:让我们的类视图继承自扩展类
延伸:定义两个扩展类
思路:类视图 —> 继承自额外扩展的类1 ---> 继承自额外扩展的类2
—> 继承自View类(包含有as_view函数)
我们定义两个扩展类继承object, 并且重写两次 as_view 方法
@classmethod
def as_view(cls, *args, **kwargs):
view = super().as_view(*args, **kwargs)
view = my_decorator(view)
return view
class DemoView(BaseView, Base2View, View)
说明
继承类的实现原因
如果两个扩展类的父类相同: 则两个父类都会调用
如果两个扩展类的父类不同: 则只会调用第一个父类
因为都是继承自object,所以扩展类中的super.as_view都会去找其他的父类依次执行,最终都会执行到View这个类这里, 所以肯定会执行View中的as_view方法
注意
如果我们在类视图函数中没有定义方法, 但是我们请求了. 会报405找不到请求方法的错误
在类视图中定义的 Get 或者是 POST 都是对象方法, 第一个参数都是self
第二个参数一般情况下都是 request对象. 其他的参数依次往后面写就可以.
5. ---中间件
1. 子应用中新建一个middleware.py文件
2. 中间件---模板
中间件工厂函数需要接收一个可以调用的get_response对象。
3. 中间件---注册
settings.py 文件中添加注册中间件
MIDDLEWARE = [ '子应用目录.中间件文件.中间件方法名' ]
了解: 多个中间件的执行顺序
1. 在请求视图被处理前,中间件由上至下依次执行
2. 在请求视图被处理后,中间件由下至上依次执行
3. 顺序指的是注册时的上下顺序
6. 模板
模板目录配置
1. 在工程中创建模板目录templates
2. settings中修改TEMPLATES配置项的DIRS值
3. 'DIRS': [os.path.join(BASE_DIR, 'templates')], # 此处修改
模板文件- ->模板目录
templates目录中存放模板文件
返回模板渲染
1. 获取模板对象:from django.template import loader
template = loader.get_template(模板文件在模板目录中的相对路径)
2. 传入数据,渲染模板,返回HTML数据,可直接返回给前端
html字符串 = template.render(context=None, request=None)
----context 为模板变量字典,默认值为None,变量名:替换数据
----request 为请求对象,默认值为None
---补充--简写方式 from django.shortcuts import render
return render(request对象, 模板文件路径, 模板数据字典)
模板语法
模板变量-{{ }}
字母、数字、下划线(不能以下划线开头)和点
{{变量}}
模板变量可以使python的内建类型,也可以是对象
字典,列表的取值,支持点语法,列表.下标,字典. 键
模板语句-for-if
for循环
{% for item in 列表 %}
循环逻辑
{{forloop.counter}}表示当前是第几次循环,从1开始
{%empty%} 列表为空或不存在时执行此逻辑
{% endfor %}
if判断
{% if ... %}
逻辑1
{% elif ... %}
逻辑2
{% else %}
逻辑3
{% endif %}
比较运算符:==,!=,<,>,<=,>= 用于条件运算
逻辑运算符:and,or,not 连接条件运算
注意:运算符左右两侧不能紧挨变量或常量,必须有空格。
过滤器
变量|过滤器:参数
使用管道符号|来应用过滤器,用于进行计算、转换操作,可以使用在变量、标签中
如果过滤器需要参数,则使用冒号:传递参数
safe,禁用转义
length,长度,返回字符串包含字符的个数,或列表、元组、字典的元素个数。
default,默认值, data|default:'默认值' 不存在时则返回默认值
date,日期,用于对日期类型的值进行字符串格式化
value|date:"Y年m月j日 H时i分s秒"
Y 年, m 月, d 01日, j 1日, H i s 时分秒
注释
单行注释:{#...#}
多行注释:
{% comment %}
...
{% endcomment %}
模板继承
父模板
{% block 名称 %}
预留区域,可以编写默认内容,也可以没有默认内容
{% endblock 名称 %}
子模板
{% extends "父模板路径"%}
标签extends:继承,写在子模板文件的第一行。
{% block 名称 %}
实际填充内容
{{ block.super }}用于获取父模板中block的内容
{% endblock 名称 %}
视图-请求-响应对象-类试图-装饰器-中间件-模板
最新推荐文章于 2022-09-22 20:51:24 发布