- 一、认识http请求
- 1.请求的方式
- 2.常见的响应码
- 3.请求request对象的方法
- 4.Django中get 和post请求获取参数的方式
- 二、Django的form表单请求
- 1.form表单简介
- 2.Django中form表单的get请求
- 3.form表单post请求
- 3.1 CSRF
- 3.2POST请求
- 三、Django中使用POST完成用户注册
- 四、django form 表单类
- 1. 定义form表单类
- 2. 使用form表单类
- 3. 修改table样式
- 4. 使用form表单类进行后端验证
可见这篇了解http:https://blog.csdn.net/qq_40558166/article/details/102770867
1.请求的方式get
https://www.baidu.com/s?wd=world&name=zhangsan
- 该请求即为get请求,get请求是web中使用最频繁的请求方式。一般是像服务器请求资源。
- 从?后开始,是参数(key=value的形式),以&符号进行区分,这个请求中携带了几个参数分别为wd和name
- 缺点:参数写在url中是不安全的,而且url长度是有限的,携带的参数数据有限
post
- 一般是向服务器提供资源。
- post请求的样式和get请求的样式相同,同时还可以把参数写在请求体当中,这样更加安全隐蔽,安全性比get高,而且传输的数据量也比较大
其他请求方式
Delete
options
put
patch
2.常见的响应码
用上述的请求服务器,会接收服务器的响应,响应码可以更好的识别我们的请求是否成功。常见的响应码如下
def reqtest(request):
# 获取get请求的参数
data=request.GET
# 获取post请求的参数
data = request.POST
print(data) # 查看post携带的参数
print(data.get('name')) # 获取地址栏的键值为name的值
print(request.COOKIES) # 用户的身份
print(request.scheme) # https还是http
print(request.method) # 查看请求的方式
print(request.path) # 查看请求的路径
print(request.body) # 查看请求的主体,返回一个字符串
print(request.META) # 包含了具体的请求数据,包含所有的http请求的信息信息
print(request.META.get('OS')) # 请求的系统
print(request.META.get('HTTP_USER_AGENT')) # 发出请求的浏览器的版本
print(request.META.get('HTTP_HOST')) # 请求的主机
print(request.META.get('HTTP_REFERER')) # 请求的来源
return HttpResponse('请求测试')
结果:
def reqtest(request):
## 获取get请求传递的参数
# data = request.GET
## 获取post 的请求参数
data = request.POST
print (data)
print (data.get("name"))
print (type(data.get("name")))
print (data.get("age"))
return HttpResponse("姓名:%s年龄%s" %(data.get("name"),data.get("age")))
发送post请求的时候,会报403(csrf)解决方案:在settings文件的中间件中将csrf验证注掉(django自动开启了csrf验证) 传入数据
form是我们创建一个表单域,例如一个个人简介的信息表单,然后我们可以把整个表单提交到某个服务器。
参数:
- action 提交的地址
- method 提交的方式 get post
- templates中创建html ,创建form标签
- 视图文件 接收请求 ,处理请求,返回响应
- 路由文件绑定路由
跨站请求伪造攻击,使用当前浏览器还在生效的cookie对指定网站进行操作,最初针对的是银行系统。
CSRF 的过程
- django本身提供对csrf的校验功能,在django 1.4 版本之前 是需要手动开启
- 在django的所有的post请求,都会在请求之初,给用户下发一个串用来校验身份的编码,并且每次请求下发的串都不一样,django的csrf 只针对post请求
django当中使用csrf的步骤:
1. 在settings文件中打开csrf相关验证
2. 在视图中返回页面,需要使用render(render_to_response),render第一个参数 是请求对象(request)如果不返回这个request,前端没法使用{% csrf_token %}
3. 在模板中的form表单域中添加 {% csrf_token %} 这个标签实际上 隐藏域,
name是 csrfmiddlewaretoken
value是 csrf 校验的值
html页面
目标: 通过前端提交用户名,密码,后端收到数据,保存数据库
1. model中完成模型的创建 创建一个user表,字段 :用户名,密码 再进行数据迁移:
python manage.py makemigrations
python manage.py migrate
2. 模板
form表单,post请求
3. 视图
接收post请求参数,写库
def register(request):
if request.method == "POST":
# 获取用户输入的数据
username = request.POST.get("username")
password= request.POST.get("password")
password2 = request.POST.get("password2")
## 判断是否有数据
content = "参数不全"
if username and password2 and password:
## 判断密码是否相等
if password != password2:
# return ''
print ("两次密码不一样")
content="两次密码不一样"
else:
## 保存数据
user = User()
user.name = username
user.password = password
user.save()
content = "添加成功"
return render(request,"register.html",locals())
4.md5进行密码加密
为了密码不泄露,我们使用md5
表单功能在实际开发中,对数据的校验,获取数据。所谓数据的校验:包括对数据的长度,数据类型,是否为空,是否符合格式。针对数据的校验:前端校验,后端校验。
例如:用户名中长度的限制、特殊字符、用户名是否存在等等。
- 前端校验
- 通过js或者jq脚本对form表单提交的数据进行校验,
- 优点: 形象,直观,减少服务器压力,有利于对用户提醒,用户体验比较好
- 后端校验
- 在视图当中,对要存储的数据进行校验,需要后端编写
- 优点:安全性高,
- 缺点: 服务器压力大,比较复杂
django前端校验可以通过校验框架进行校验,django推出form表单类来进行校验
1. 定义form表单类跟模型类相似
form表单类是django定义的,可以自动生成前端form表单代码的一个表单类,已完成大部分校验功能。
常见的样式:
table样式: as_table被闲置,样式跟普通的样式一样,以前的布局使用table布局,现 在用的 div布局。table没有任何样式
3. 修改table样式 django提供的form表单类中只提供了样式,没有form表单域,也没有提交按钮,优点:方便开发人员修改样式。如果要提交,外面包围一个form表单
自定义table样式
{% csrf_token %}
{% for one in regiter_form %}
{{ one.label }}
{{ one }}
{% endfor %}
修改视图
def register(request):
regiter_form = Register() ## 创建一个form表单类的实例对象
if request.method == "POST":
# 获取用户输入的数据
# username = request.POST.get("username")
username = request.POST.get("name")
password= request.POST.get("password")
## 判断是否有数据
content = "参数不全"
if username and password:
user = User()
user.name = username
## 加密密码
user.password = setPassword(password)
user.save()
content = "添加成功"
return render(request,"register.html",locals())
使用form表单类进行数据的校验通过字段属性进行校验
max_length 最大长度
min_length 最小长度
required=True 是否允许为空,默认为True,不可为空
label form表单类的标签的内容
help_text 帮助文档,有的浏览器显示不出来
form表单类,虽然能够完成前端校验,但是不用,form类经常被用来做后端校验
4. 使用form表单类进行后端验证- 模板
注册
{% csrf_token %}
{% for one in regiter_form %}
{{ one.label }}
{{ one }}
{% endfor %}
{{ error }}
- 视图
## 使用form表单进行验证 后端验证
## 验证用户名是否包含 特殊字符 admin
def register(request):
regiter_form = Register() ## 创建一个form表单类的实例对象
error = ""
if request.method == "POST":
data = Register(request.POST) ## 将post请求传递过来的数据,交给 form表单类进行校验
if data.is_valid(): ## 判断校验是否通过, 如果通过 返回一个True 否则 是Flase
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())
- 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表单类:
- 创建一个forms.py文件,定义一个form表单类,类名(随意), 字段(字段属性)跟models写法相同,需要判断哪个字段,表单类添加哪个字段, 通过字段属性做前端数据校验
- 写一个视图,返回一个摸板类的实例对象,这个对象实际上提供了form表单(但是没有form标签)
- 写一个模板使用for循环,循环form表单类,增加form标签,然后获取数据,进行提交
- 视图获取数据,进行校验 校验: 在form表单类中完成关于数据的校验 成功: 返回成功 失败:构建失败的提示,返回