一、认识http请求
Django视图中的request(包含了请求信息的请求对象)
(一)请求的方式
-
get
-
默认页面的请求方式,是get请求zai web中使用最频繁的请求方式
-
请求服务器资源,可以鞋带参数,参数写在url中,不安全,反爬取能力弱
-
https://www.baidu.com/s?wd=world&name=zhangsan
-
参数从?开始,多个参数使用&
-
参数是以key=value
-
以&进行分割
-
-
post
- 想服务器提供资源,数据包含在请求体中,隐藏传递,安全性比get请求高,传输数据的量比get请求大
-
delete
-
options
-
put
-
patch
-
head
(二)响应码
-
100 服务器收到请求,需要用户继续操作,例如:发出请求需要用户继续输入密码
- 101 根据客户端的需求转换协议
-
200 请求成功,服务器成功处理了请求
- 202 请求已经被接受,但是还没有处理完
-
300 请求重定向
- 303 对应当前的需求需要在另一个url地址中才能找到,客户端通过get请求方式去访问那个地址
-
400 客户端错误
-
403 服务器理解了请求,但是拒绝了用户的请求,CSRF
-
404 页面找不到
-
-
500 服务端错误
- 502 bad gateway 服务器错误,代理有问题
(三)请求参数
request.COOKIES 用户身份
request.FILES 请求携带的文件,比如图片
request.GET get请求鞋带的参数
request.POST post请求携带的参数
request.scheme https还是http
request.method 请求的方式
request.path 请求的路径
request.body 请求的主体,返回的是一个字符串
request.META 包含了具体的请求数据,包含了所有的http请求的信息
request.META.get('OS') 请求的系统
request.META.get('HTTP_USER_AGENT') 发出请求的浏览器的版本
request.META.get('HTTP_HOST') 请求的主机
request.META.get('HTTP_REFERER') 请求的来源
(四)获取请求传递的参数
1.get
2.post
发送post请求的时候,会报403(csrf 跨站请求伪造)
解决方案:在settings文件中的中间件中将csrf验证注释掉,Django自动开启了csrf验证(MIDDLEWARE中的’django.middleware.csrf.CsrfViewMiddleware’)
3.Django的form表单请求
(1)form表单
form创建一个表单域
input select
type name value class id
submit button
action 提交的地址
method 提交的方式 get(默认) post
(2)form表单的get请求
- templates:创建html放form表单
- 获取数据:获取用户输入数据
- 进行提交:submit进行提交
- 视图
- 接受请求,处理请求,返回响应
- 路由
- 将视图函数跟路由绑定
通过form输入文章标题,搜索文章名字
1.编写html,写一个form表单,提交一个搜索内容
2.视图:get请求参数
1.使用模糊查询,查询文章标题
2.返回查询结果
(3)form表单的post请求
CSRF
跨站请求伪造攻击,使用当前浏览器还在生效的cookie对指定网站进行操作,最初针对的是银行系统
(4)POST请求
Django本身提供对csrf的校验功能,在Django 1.4版本之前是需要手动开启。
在Django的所有的post请求,都会在请求之初,给用户下发一个串,用来校验身份的编码,并且每次请求下发的串都不一样,Django的scrf只针对post请求
Django当中使用csrf的步骤:
1.在settings文件中打开csrf相关验证
2.在视图中返回页面,需要使用render(render_to_response),render第一个参数,是请求对象
(request)如果不返回这个request,前端没法使用{% csrf_token %}
3.在模板中的form表单域中添加{% csrf token %}这个标签实际上隐藏域,name是csrfmiddlewaretoken
value是csrf校验的值
前端页面
(5)POST完成用户注册
目标:通过前端提交用户名,密码,后端收到数据,保存数据库
1.完成模型的创建
创建一二个user表,字段:用户名,密码
数据迁移
2.模板
form表单,post请求
3.视图
接收post请求参数
写库
(6)密码密文
加密:md5 不可逆的加密 string–>密文 password->密文 123456–>密文
(7)Django form 表单类
表单功能在实际开发中,对数据的校验,获取数据。
所谓数据的校验:包括对数据的长度,数据类型,是否为空,是否符合格式。
针对数据的校验:前端校验,后端校验。
例如:用户名:长度限制,特殊字符,用户名是否存在。
- 前端校验
- 通过js或者jq脚本对form表单提交的数据进行校验
- 有点:形象,直观,减少服务器压力,有利于对用户提醒,用户体验比较好
- 后端校验
- 在视图中,对要存储的数据进行校验,需要后端编写
- 优点:安全性高
- 缺点:服务器压力大,比较复杂
Django前端校验可以通过校验框架进行校验
a.定义一个form表单类
b.使用form表单类
form表单类是Django定义的,可以自动生成前端form表单代码的一个表单类,已完成大部分校验功能。
常见样式:
table样式:
as_table被闲置,样式跟普通样式一样,以前的布局使用table布局,现在用的div布局。table没有任何样式。
c.修改table样式
Django提供的form表单类中只提供了样式,没有form表单域,也没有提交按钮,优点:方便开发人员修改样式,如果要提交,外面包为一个form表单
修改视图
使用form表单类进行数据的校验通过字段属性进行校验
max_length 最大长度
min_length 最小长度
required=True 是否允许为空,默认为True,不可为空
label form表单类的标签的内容
help——text 帮助文档,有的浏览器显示不出来
form表单类,虽然能够完成前端校验,但是不用,form类经常被用来做后端校验
d.使用form表单类进行后端验证
1.模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册</title>
</head>
<body>
<form action="" method="post">
{% csrf_token %}
{% for one in regiter_form %}
<p>
{{ one.label }}
{{ one }}
</p>
{% endfor %}
<p>
<input type="submit" value="提交">
</p>
</form>
{{ error }}
</body>
</html>
2.视图
# 使用form表单进行验证,后端验证
# 验证用户名是否包含特殊字符,admin
from Article.forms import Register
def register(request):
register_form = Register() # 创建一个form表单类的实例对象
error = ''
# 获取用户输入的数据
if request.method == 'POST':
data = Register(request.POST) # 将post请求传递过来的数据,交给form表单类进行校验
if data.is_valid(): # 判断校验是否通过,如果返回一个True,否则False
clean_data = data.cleaned_data # 返回一个字典类型,数据通过校验的数据
# 获取到数据,写库
username = clean_data.get('name')
password = clean_data.get('password')
user = User()
user.name = username
# 加密密码
user.password = setPassword(password)
user.save()
error = '添加数据成功'
else:
error = data.errors
print(error)
return render(request,'register.html',locals())
3.form表单类
from django import forms
class Register(forms.Form):
name = forms.CharField(required=True,label='姓名')
password = forms.CharField(max_length=8,min_length=6,label='密码')
# 固定写法
def clean_name(self):
"""
自定义校验 用户名不允许是admin
"""
name = self.cleaned_data.get('name')
if name =='admin':
self.add_error('name','不可以是admin')
else:
return name
form表单类:
1.创建一个forms.py文件,定义一个form表单类,类名(随意),字段(字段属性)跟models写法相同,需要判断哪个字段,表单类天剑哪个字段,通过字段属性做前端数据校验
2.写一个视图,返回一个模板类的实例对象,这个对象实际上提供了form表单(但是没有form标签)
3.写一个模板使用for循环,循环form表单类,增加form标签,然后获取数据,进行提交
4.视图获取数据,进行校验
校验:在form表单类中完成关于数据的校验
成功:返回成功
失败:构建失败的提示,返回