第十八天
认识http请求
django视图中的request(包含了请求信息的请求对象)
请求方式
1、get
- 默认页面的请求方式 是 get请求,在web中使用最频繁的请求方式
- 请求服务器资源,可以携带参数,参数写在url中,不安全,反爬能力弱
- https://www.baidu.com/s?wd=world&name=zhangsan
- 参数 从 ?开始,多个参数使用 &
- 参数是以 key=value
- 以&进行分割
2、post
- 向服务器提供资源,数据包含在请求体当中,隐藏传递,安全性比get请求高,传输数据的量比get请求大
3、delete
4、options
5、put
6、patch
7、head
响应码
- 100 服务器收到请求,需要用户继续操作,例如:发出请求,但是需要用户继续输入密码
- 101 根据客户端需求转换协议
- 200 请求成功,服务器成功处理了请求
- 202 请求已经被接受,但是还没有处理完
- 300 请求重定向
- 303 对应当前的需求需要在另一个url地址中才能找到,客户端通过get请求方式去访问那个地址
- 400 客户端错误
- 403 服务器理解了请求,但是拒绝了用户的请求,CSRF
- 404 页面找不到
- 500 服务端错误
- 502 bad gateway 服务器错误,代理有问题
请求request对象的方法
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') 请求的来源
def reqtest(request):
## request包含请求信息的 请求对象
# print (request)
print (dir(request))
# print (request.COOKIES)
# print (request.FILES)
print (request.GET)
print (request.scheme)
print (request.method)
print (request.path)
print (request.body)
# meta = request.META
# print (meta)
# for key in meta:
# print(key)
# print ("_____")
# 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("请求测试")
获取请求传递的参数
get 和post请求 获取参数
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验证
注意:一般不用这样的方式,可以再前端页面加上{% csrf_token%}
Django的form表单请求
form表单
form 创建一个表单域
input select
type name value class id
submit button
action 提交的地址
method 提交的方式 get post
form表单 get请求
- templates 创建html 放 form表单
- 获取数据:获取用户输入数据
- 进行提交: submit 进行提交
- 视图
- 接收请求 ,处理请求,返回响应
- 路由
- 将视图函数跟路由绑定
例子:通过form输入文章标题,搜索文章名字
- 将视图函数跟路由绑定
- 编写html,写一个form表单,提交一个搜索内容
- 视图: get请求参数
. 使用模糊查询,查询文章标题
. 返回查询结果
form表单 post请求
CSRF 跨站请求伪造
跨站请求伪造攻击,使用当前浏览器还在生效的cookie对指定网站进行操作,最初针对的是银行系统。
POST请求
django本身提供对csrf的校验功能,在django 1.4 版本之前 是需要手动开启,
在django的所有的post请求,都会在请求之初,给用户下发一个串用来校验身份的编码,并且每次请求下发的串都不一样,django的csrf 只针对post请求
django当中使用csrf的步骤
- 在settings文件中打开csrf相关验证
- 在视图中返回页面,需要使用render(render_to_response),render第一个参数 是请求对象(request)如果不返回这个request,前端没法使用{% csrf_token %}
- 在模板中的form表单域中添加 {% csrf_token %} 这个标签实际上 隐藏域,
name是csrfmiddlewaretoken
value是 csrf 校验的值
查看前端页面
POST完成用户注册
目标: 通过前端提交用户名,密码,后端收到数据,保存数据库
1、完成模型的创建
创建一个user表,字段 :用户名,密码
数据迁移
2、模板
form表单,post请求
3、视图
接收post请求参数
写库
密码密文
加密: md5 不可逆的加密 通过md5实现密码加密
django form 表单类
1. 定义form表单类
跟模型类相似
2. 使用form表单类
form表单类是django定义的,可以自动生成前端form表单代码的一个表单类,已完成大部分校验功能。
常见的样式:
table样式:
as_table 被闲置,样式跟普通的样式一样,以前的布局使用table布局,现在用的div布局。table没有任何样式
3. 修改table样式
django提供的form表单类中只提供了样式,没有form表单域,也没有提交按钮,优点:方便开发人员
修改样式。如果要提交,外面包围一个form表单
修改视图
使用form表单类进行数据的校验通过字段属性进行校验
form表单类,虽然能够完成前端校验,但是不用,form类经常被用来做后端校验
4. 使用form表单类进行后端验证
模板
视图
form表单类
步骤