Django2

视图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)
image.png
2.2 url传递多个参数
如果需要获取url路径中的多个参数,那就添加多个括号,默认按照顺序匹配路径名字,参数顺序必须固定
定义url中传递三个参数的地址:
    url(r‘^news/(\d{4})/(\d)+/(\d+)$’, views.getNews)
    实现方法:匹配年月日 def getNews(requests, year, month, day)

例子:查找计算机技术书籍下的脚本语言中的python的书籍信息

image.png


2.3 使用关键词获取参数

参数也可以使用关键字参数形式,参数顺序可以任意
url(r’news/(?P<year>\d{4})/(?P<month>\d)+/(?P<day>\d+)$’, views.getNews)

image.png


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’)
在模板中使用:
<a href=’{% url ‘app:sayhello’ grade_id%}’> 其中grade_id是参数,其中参数可以使用位置参数,也可以使用关键词参数,和配置urls一样


image.png

3.2 在views中使用反向解析

使用反向解析优点
如果在视图中,模板中使用硬编码连接,在url配置发生改变时,需要变更的代码会非常多,这样导致我们的代码结构不是很容易维护,使用反向解析可以提高我们代码的扩展性和可维护性

    HttpResponseRedirect(reverse(namespace:name, kwargs = {key1 : value1, key2 : value2}))
    kwargs 是字典


image.png


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的情况下会在界面中直接显示错误的信息

image.png
4.2.2 在templates文件中定义自己的错误样式
image.png

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’)
image.png

如下,获取重复提交数据的方法:

image.png
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自己维护

实现原理:

image.png

存储值原理图:

image.png

3. 用户认证系统的cookies和session的工作流程:

  1. 当用户使用用户名和密码进行登录认证,如果认证成功,则返回一个response响应,并绑定cookie。cookie中需设置一个键值对,键为sessionID,值为随机字符串。
image.png
  1. 服务端以发送给客户端cookie中的随机字符串为键,用户的基本信息为值,将数据保存起来。
image.png
  1. 当用户下次发送URL请求,服务端可以通过cookie中的随机字符串,找到在服务端中保存用户的基本信息。

登录/注册/登录状态权限验证指南

前言

通过cookie和token去实现登录功能,用户在登录账号以后,随机产生一个随机数并存在cookie中,并在服务端也存储同一个数在数据库中。
当下一次url请求过来的时候,解析request中绑定的cookie信息,解锁出之前存的随机数,判断该随机数是否是存储在服务器端的数据,如果
没有查询到则表示该cookie过期,或者该cookie是伪造的,或者服务器上存储该信息的数据缓存到期被清空了。则该提示用户重新登录,并且
重新产生随机数,并存储在cookie中以及服务端,以保证下次请求和响应能够顺利。

习题

题目:

  1. 编写一个方法,用于注册用户的账号和密码。

  2. 编写一个方法,用于登录用户的账号和密码,并且登录的时候绑定一个加密的参数在cookie上,并且该加密参数也存储在服务端中。

3)在以后的任意一个请求,我们都获取request中的cookies,查看cookie中绑定的参数是否合法,以及查询是否在服务端存储了。

4)如果验证成功则返回请求url的结果信息到页面,如果验证失败则返回错误提醒信息页面

  1. 注销登录

6)定义装饰器去验证用户登录以后才执行对应的视图函数,反之跳转到登录页面中

1. 注册方法

从页面中获取账号和密码,进行创建

image.png

2. 登录,并且绑定参数到cookie上

先检验用户名是否在数据库中,如果查询到则继续验证密码, 如果密码验证对,则绑定一个参数到cookie中。
解析密码,加密密码来源与一下的模块:

from django.contrib.auth.hashers import check_password, make_password
image.png

3. 在方法中验证cookie中传递的参数是否正确

cookie是在用户提交url请求的时候都会带上的一个参数,所以可以从中获取到我们设置的参数,并且在服务端进行验证,看服务端有这个标识符没有,
如果能查询到,则表示用户登录过了,并且还在登录时效内,则直接返回用户提交url对应的响应。如果在服务端没有查询到数据,则表示标识符过期,
或者无效了,需要登录了,则直接提示错误信息即可!

image.png

4. 注销登录

删除cookie中的认证令牌

image.png

5. 通过定义装饰器去验证用户是否是登录状态,如果不是,则跳转到登录

定义装饰器--闭包

image.png

登录/注册/登录状态权限验证指南

前言

在django中,django帮我们封装好了登录注册以及注销的函数,在下面的代码案例中,我们将使用django定义好的注册登录注销函数去实现用户的登录验证,用户登录,以及用户注销等操作,以及定义login_rqueired装饰器,去装饰我们定义的函数,实现登录才能处理对应的业务逻辑

1. 实现注册方法

1.1 页面提交注册字段

在页面的form中有一下三个字段,用户名和密码1和密码2,页面在submit提交的时候,会提交该三个字段后后端,在后端中获取该参数即可

image.png

1.2 后端处理注册的信息

后端获取前端传递的参数,进行简单的验证后,进行创建用户的信息

image.png

2. 实现登录方法

2.1 登录页面提交登录的字段

image.png

2.2 后端进行登录的验证

image.png

3. 实现注销方法

image.png

4. 登录验证

from django.contrib.auth.decorators import login_required

使用login_required装饰器去装饰自定义的视图函数

实现图片上传展示等操作指南

前言

在很多开发功能里面都涉及到需要上传图片的地方,比如头像,或者封面图,或者内容中插入图片信息等,此指南就是来简单的实现一个图片文件上传并且展示的功能演示

习题

题目:

  1. 编写一个页面,用于提交数据,包括用户的名称,和头像图片
  2. 编写一个方法,用户保存页面提交的用户名称和图片信息,将图片保存到指定的文件夹中
    3)配置静态页面解析,在页面中展示出上传图片

0. 安装处理图片的库

pip install Pillow

1. 修改配置信息

在工程目录中,修改setting.py文件,在最后面加入一下配置信息:

image.png

在urls.py文件中加入信息
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

2. 定义模型

在模型中加入ImageFiled字段,并且指定上传的图片的保存路径

image.png

3. 在页面中传递图片信息,和用户名信息

image.png

4. 在服务端接受请求,并且保存图片信息

image.png

5. 页面展示

image.png

推荐阅读更多精彩内容