视图1使用指南
前言
MVT模式中的V,V代表视图,在Django中的视图主要用来接受web请求,并做出响应。视图的本质就是一个python中的函数
视图的响应分为两大类
以json数据形式返回
以网页的形式返回
重定向到另一个网页
错误视图页面(404,500等)
视图响应的过程:浏览器输入 → django获取信息并去掉ip:端口,身下路径 → urls路由匹配 → 视图响应 → 回馈到浏览器
1. url配置
1.1 配置流程
settings中制定根级url配置文件,对应的属性ROOT_URLCONF
1.2 urlpatterns
一个url实例的对象,全在根配置搞定
内部由url组成(正则匹配路径)
url(r‘^learn/’, views.learn)
1.3 导入其他的url配置
在应用中创建urls.py 文件,编写配置规则,在工程urls.py中进行
导入包含
From django.conf.urls import include
urlpatterns = [url(r’^xxx/’, include(‘app.urls’))]
注意:
url配置正则注意事项:
正则匹配时从上到下进行遍历,匹配到就不会继续向后查找了
匹配的正则前方不需要加反斜杠
正则钱需要加(r)表示字符串不转义
2. 获取url路径的参数
2.1 url传递一个参数
如果需要从url中获取一个值,需要对正则加小括号
url(r‘^grade/(\d+)$’, views.getStudent)
注意,url匹配中添加了()取参,在请求调用的函数中必须接收 def getStudent(request, classid)
2.2 url传递多个参数
如果需要获取url路径中的多个参数,那就添加多个括号,默认按照顺序匹配路径名字,参数顺序必须固定
定义url中传递三个参数的地址:
url(r‘^news/(\d{4})/(\d)+/(\d+)$’, views.getNews)
实现方法:匹配年月日 def getNews(requests, year, month, day)
例子:查找计算机技术书籍下的脚本语言中的python的书籍信息
2.3 使用关键词获取参数
参数也可以使用关键字参数形式,参数顺序可以任意
url(r’news/(?P
3. 反向解析
3.1 在模板中进行反解析
关键字参数{% url namespace:name key=value key1=value1 %}
定义url:
在根urls中 url(r’^apps/’, include(‘App.urls’, namespace=’app’)) 在子urls中 url(r’^hello/(\d+)’, views.hello, name=’sayhello’)
在模板中使用:
其中grade_id是参数,其中参数可以使用位置参数,也可以使用关键词参数,和配置urls一样
3.2 在views中使用反向解析
使用反向解析优点
如果在视图中,模板中使用硬编码连接,在url配置发生改变时,需要变更的代码会非常多,这样导致我们的代码结构不是很容易维护,使用反向解析可以提高我们代码的扩展性和可维护性
HttpResponseRedirect(reverse(namespace:name, kwargs = {key1 : value1, key2 : value2}))
kwargs 是字典
4. 视图
4.1 错误视图
位置:通常在应用下的views.py中定义
错误视图:
404视图(页面没有被找到 page not found)
400视图(客户端操作错误 bad request)
403视图(权限错误 403 forbidden )
500视图(服务器内部错误 server error)
4.2 自定义错误视图
4.2.1 修改debug模式
在工程的settings中修改debug模式:
注意:
需要在debug=False的情况下才可以
没有关闭debug的情况下会在界面中直接显示错误的信息
4.2.2 在templates文件中定义自己的错误样式
5.请求与响应
5.1 HttpRequest定义
服务器在接收到http请求后,会根据报文创建HttpRequest对象
视图中第一个参数就是HttpRequest对象
Django框架会进行自己的包装,之后传递给视图
属性:
path 请求的完整路径
method 请求的方法,通常get,post
Encoding 编码方式,常用utf-8
Get 类似字典的参数,包含了get的所有参数
post 类似字典的参数,包含了post的所有参数
Files 类似字典的参数,包含了上传的文件
Cookies 字典,包含了所有的COOKIES
Session 类似字典,表示会话
方法: is_ajax() 判断是否是ajax(),通常在移动端和js中
5.2 响应QueryDict类型
1)类似字典的结构数据,与字典的区别,可以存在相同的键
2)GET和POST都是QueryDict对象
3)QueryDict中数据获取方式
dict[‘name’] 或者dict.get(‘name’)
获取指定key对应的所有值
dict.getlist(‘name’)
如下,获取重复提交数据的方法:
5.3 响应
1)可以直接返回一个HttpResponse对象:
服务器返回给客户端的数据,HttpResponse由程序员自己创建
不使用模板,直接HttpResponse()
2)可以返回模板
调用模板,进行渲染,直接使用render一步到位
返回表达式:
render(request, template_name, context)
request 请求体对象
template_name 模板路径
context 字典参数,用来填坑
3)属性
Content 返回的内容
Charset 编码格式
status_code 响应状态码(200,4xx,5xx)
4xx 客户端的错误
5xx 服务端的错误
content_type MIME类型,定义传输类型的,比如有xml,html,png等等,比如content_type=’image/jpg’
4)方法
init 初始化内容
write(xxx) 直接写到文本
flush 冲刷缓冲区
set_cookie(key, value=’’, max_age=None, exprise=None)
delete_cookie(key) 删除cookie,上面是设置
4)重定向
HttpResponseRedirect响应重定向:可以实现服务器内部的跳转
Return HttpResponseRedirect(‘/xxx/xxx’)
使用的时候推荐使用反向解析
JsonResponse
使用json数据的请求,通常用在异步请求上jsonResponse(dict)
content_type是application/json
视图2使用指南
前言
回话技术,比如在做登录功能的时候,需要配合是用存储在客户端的cookie信息,以及存储在服务端的session来实现登录功能。
在cookie中保存了用户的信息,特别是一个特殊的令牌信息,当用户拿着这个特殊的令牌来访问网站的时候,网站会从cookie中
获取这个特殊令牌去数据库session中去查询是否有这个对应的令牌的信息,如果有则验证成功,就可以把用户的信息返回给客户端
了,如果验证失败则提示用户没有登录等等提示信息。
cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生。
cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上cookie,这样服务器就能通过cookie的内容来判断这个是“谁”了。
cookie虽然在一定程度上解决了“保持状态”的需求,但是由于cookie本身最大支持4096字节,以及cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是session。
问题来了,基于http协议的无状态特征,服务器根本就不知道访问者是“谁”。那么上述的cookie就起到桥接的作用。
我们可以给每个客户端的cookie分配一个唯一的id,这样用户在访问时,通过cookie,服务器就知道来的人是“谁”。然后我们再根据不同的cookie的id,在服务器上保存一段时间的私密资料,如“账号密码”等等。
总结而言:cookie弥补了http无状态的不足,让服务器知道来的人是“谁”;但是cookie以文本的形式保存在本地,自身安全性较差;所以我们就通过cookie识别不同的用户,对应的在session里保存私密的信息以及超过4096字节的文本。
另外,上述所说的cookie和session其实是共通性的东西,不限于语言和框架
1. cookie
HTTP 协议是无状态的。因此,若不借助其他手段,远程的服务器就无法知道以前和客户端做了哪些通信。Cookie 就是「其他手段」之一。 Cookie 一个典型的应用场景,就是用于记录用户在网站上的登录状态。
用户登录成功后,服务器下发一个(通常是加密了的)Cookie 文件。
客户端(通常是网页浏览器)将收到的 Cookie 文件保存起来。
下次客户端与服务器连接时,将 Cookie 文件发送给服务器,由服务器校验其含义,恢复登录状态(从而避免再次登录)。
1.1 描述
浏览器端的回话技术
cookie本身由浏览器生成,通过Response将cookie写在浏览器上,下一次访问,浏览器会根据不同的规则携带cookie过来
1.2 cookie方法
设置:response.set_cookie(key, value, max_age=None, exprise=None)
获取:request.GET.get(key)
删除:request.delete_cookie(key)
注意:cookie不能跨浏览器
参数定义:
max_age和exprise时间:
max_age : 整数,指定cookie过期时间,以秒为单位
exprise: 整数,指定过期时间,还支持是一个datetime或者timedelta,可以指定一个具体日期时间
设置10天后过期:
exprise=datetime.datetime.now() + timedelta(days=10) 10天后过期
永不过期:
exprise设置为None表示为永不过期
2. session
2.1 描述
服务端会话技术,依赖于cookie
2.2 开启session设置
1)django中启用SESSION
在settings中修改如下地方
INSTALLED_APPS:
‘django.contrib.sessions’
MIDDLEWARE:
‘django.contrib.sessions.middleware.SessionMiddleware’
每个HttpResponse对象都有一个session属性,也是一个类字典对象
2.3 常用操作
request.session[‘user’] = username 设置数据
request.session.get(key, default=None) 根据键获取会话的值
request.session.flush() 删除当前的会话数据并删除会话的cookie,django.contrib.auth.logout() 函数中就会调用它。
request.session.session_key 获取sessionid值
request.session.delete(request.session.session_key) 删除当前用户的所有Session数据
del request.session['key'] 删除session中的key值
request.session.set_expiry(value)
如果value是个整数,session会在些秒数后失效
如果value是个datatime或timedelta,session就会在这个时间后失效。
如果value是0,用户关闭浏览器session就会失效。
数据存储到数据库中会进行编码使用的是base64
代码如下:
from django.http import HttpResponseRedirect
from django.shortcuts import render
from django.urls import reverse
def index(request):
if request.method == 'GET':
username = request.session.get('username')
# username = request.session['username']
print(username)
# 获取session_key
session_key = request.session.session_key
print(session_key)
# 删除session整条记录
request.session.delete(session_key)
# 删除session中的数据
del request.session['username']
username = request.session.get('username')
print(username)
return render(request, 'index.html')
def setCookie(request):
if request.method == 'GET':
res = HttpResponseRedirect(reverse('myapp:index'))
# 设置cookie值
# set_cookie(key, value, max_age, expires)
# 删除:delete_cookie(key) set_cookie(key, value, max_age=0)
# res.set_cookie('session_id', '12t861ihafiagdfi', max_age=3)
# res.delete_cookie('session_id')
# 设置cookie中的值,并且设置session中的值
# 登录的时候,进行验证用户的用户名和密码是否正确,如果正确
request.session['login'] = True
request.session['username'] = '张三'
request.session['password'] = '123456'
return res
注意:
Session 支持中文 cookie不支持中文 token自己维护
实现原理:
存储值原理图:
3. 用户认证系统的cookies和session的工作流程:
- 当用户使用用户名和密码进行登录认证,如果认证成功,则返回一个response响应,并绑定cookie。cookie中需设置一个键值对,键为sessionID,值为随机字符串。
- 服务端以发送给客户端cookie中的随机字符串为键,用户的基本信息为值,将数据保存起来。
- 当用户下次发送URL请求,服务端可以通过cookie中的随机字符串,找到在服务端中保存用户的基本信息。
登录/注册/登录状态权限验证指南
前言
通过cookie和token去实现登录功能,用户在登录账号以后,随机产生一个随机数并存在cookie中,并在服务端也存储同一个数在数据库中。
当下一次url请求过来的时候,解析request中绑定的cookie信息,解锁出之前存的随机数,判断该随机数是否是存储在服务器端的数据,如果
没有查询到则表示该cookie过期,或者该cookie是伪造的,或者服务器上存储该信息的数据缓存到期被清空了。则该提示用户重新登录,并且
重新产生随机数,并存储在cookie中以及服务端,以保证下次请求和响应能够顺利。
习题
题目:
编写一个方法,用于注册用户的账号和密码。
编写一个方法,用于登录用户的账号和密码,并且登录的时候绑定一个加密的参数在cookie上,并且该加密参数也存储在服务端中。
3)在以后的任意一个请求,我们都获取request中的cookies,查看cookie中绑定的参数是否合法,以及查询是否在服务端存储了。
4)如果验证成功则返回请求url的结果信息到页面,如果验证失败则返回错误提醒信息页面
- 注销登录
6)定义装饰器去验证用户登录以后才执行对应的视图函数,反之跳转到登录页面中
1. 注册方法
从页面中获取账号和密码,进行创建
2. 登录,并且绑定参数到cookie上
先检验用户名是否在数据库中,如果查询到则继续验证密码, 如果密码验证对,则绑定一个参数到cookie中。
解析密码,加密密码来源与一下的模块:
from django.contrib.auth.hashers import check_password, make_password
3. 在方法中验证cookie中传递的参数是否正确
cookie是在用户提交url请求的时候都会带上的一个参数,所以可以从中获取到我们设置的参数,并且在服务端进行验证,看服务端有这个标识符没有,
如果能查询到,则表示用户登录过了,并且还在登录时效内,则直接返回用户提交url对应的响应。如果在服务端没有查询到数据,则表示标识符过期,
或者无效了,需要登录了,则直接提示错误信息即可!
4. 注销登录
删除cookie中的认证令牌
5. 通过定义装饰器去验证用户是否是登录状态,如果不是,则跳转到登录
定义装饰器--闭包
登录/注册/登录状态权限验证指南
前言
在django中,django帮我们封装好了登录注册以及注销的函数,在下面的代码案例中,我们将使用django定义好的注册登录注销函数去实现用户的登录验证,用户登录,以及用户注销等操作,以及定义login_rqueired装饰器,去装饰我们定义的函数,实现登录才能处理对应的业务逻辑
1. 实现注册方法
1.1 页面提交注册字段
在页面的form中有一下三个字段,用户名和密码1和密码2,页面在submit提交的时候,会提交该三个字段后后端,在后端中获取该参数即可
1.2 后端处理注册的信息
后端获取前端传递的参数,进行简单的验证后,进行创建用户的信息
2. 实现登录方法
2.1 登录页面提交登录的字段
2.2 后端进行登录的验证
3. 实现注销方法
4. 登录验证
from django.contrib.auth.decorators import login_required
使用login_required装饰器去装饰自定义的视图函数
实现图片上传展示等操作指南
前言
在很多开发功能里面都涉及到需要上传图片的地方,比如头像,或者封面图,或者内容中插入图片信息等,此指南就是来简单的实现一个图片文件上传并且展示的功能演示
习题
题目:
- 编写一个页面,用于提交数据,包括用户的名称,和头像图片
- 编写一个方法,用户保存页面提交的用户名称和图片信息,将图片保存到指定的文件夹中
3)配置静态页面解析,在页面中展示出上传图片
0. 安装处理图片的库
pip install Pillow
1. 修改配置信息
在工程目录中,修改setting.py文件,在最后面加入一下配置信息:
在urls.py文件中加入信息
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
2. 定义模型
在模型中加入ImageFiled字段,并且指定上传的图片的保存路径