Django--请求:请求的方式、响应码、请求参数、获取请求传递的参数(get、post、form表单)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_44863429/article/details/100940669

一、认识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表单类中完成关于数据的校验

​ 成功:返回成功

​ 失败:构建失败的提示,返回

猜你喜欢

转载自blog.csdn.net/weixin_44863429/article/details/100940669