http请求 报错(403)的解决方法 django的form表单请求(get和post)django的form表单类(用于后端校验字段属性)CSRF

1.认识http请求


django视图中的request(包含了请求信息的请求对象)


1.请求的方式


① get

  • 默认页面的请求方式 是 get请求,在web中使用最频繁的请求方式
  • 请求服务器资源,可以携带参数,参数写在url中,不安全,反爬能力弱
  • https://www.baidu.com/s?wd=world&name=zhangsan
  • 参数 从 ?开始,多个参数使用 &
  • 参数是以 key=value
  • 以&进行分割

② post

  • 向服务器提供资源,数据包含在请求体当中,隐藏传递,安全性比get请求高,传输数据的量比get请求大

③ Delete
④ options
⑤ put
⑥ patch
⑦ head


2.响应码


响应码对应意义
100服务器收到请求,需要用户继续操作,例如:发出请求,但是需要用户继续输入密码
101根据客户端需求转换协议
200请求成功,服务器成功处理了请求
202请求已经被接受,但是还没有处理完
300请求重定向 重定向(Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置(如:网页重定向、域名的重定向、路由选择的变化也是对数据报文经由路径的一种重定向)。
303对应当前的需求需要在另一个url地址中才能找到,客户端通过get请求方式去访问那个地址
400客户端错误
403服务器理解了请求,但是拒绝了用户的请求,CSRF
404页面找不到
500服务端错误
502bad gateway 服务器错误,代理有问题

3.请求request对象的方法


request对象的方法意义
request.COOKIES用户身份
request.FILES请求携带的文件,比如图片
request.GETget请求携带的参数
request.POSTpost请求携带的参数
request.schemehttps还是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):
    print(request)
    print(dir(request)) ## 看request里面有什么方法
    print(request.COOKIES)
    print(request.FILES)
    print(request.GET)
    print(request.POST)
    print(request.scheme)
    print(request.method)
    print(request.path)
    print(request.body)
    print(request.META)
    meta = request.META
    print (meta)
    for key in meta:
        print(key)
    print ("_____")
    print(request.META.get('OS') )
    print(request.META.get('HTTP_USER_AGENT'))
    request.META.get('HTTP_HOST')
    # 请求的主机
    request.META.get('HTTP_REFERER')
    return HttpResponse("请求测试")


4.获取请求传递的参数


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)错误的两种解决方法


1.在settings文件的中间件中将csrf验证注掉


django自动开启了csrf验证
在这里插入图片描述


2.在html中添加


在这里插入图片描述
一般用在post请求中,会遇到csrf。
在这里插入图片描述
在模板中加入{% csrf_token %}后
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
视图中需要用到render返回,render中的request返回了csrfmiddlewaretoken的值,在django的所有的post请求,都会在请求之初,给用户下发一个串用来校验身份的编码,并且每次请求下发的串都不同,而request就返回了这个串
在这里插入图片描述


3.CSRF的介绍


跨站请求伪造攻击,使用当前浏览器还在生效的cookie对指定网站进行操作,最初针对的是银行系统。

三、Django的form表单请求


1.form表单 get请求


  • templates 创建html 放 form表单
    • 获取数据:获取用户输入数据
    • 进行提交: submit 进行提交
  • 视图
    • 接收请求 ,处理请求,返回响应
  • 路由
    • 将视图函数跟路由绑定
      在这里插入图片描述

2.通过form输入文章标题,搜索文章名字


在这里插入图片描述

  1. 编写html,写一个form表单,提交一个搜索内容
  2. 视图: get请求参数
    1. 使用模糊查询,查询文章标题
    2. 返回查询结果

3.form表单post请求


CSRF跨站请求伪造攻击
模拟一下,qq空间
在这里插入图片描述
CSRF 的过程(如果换个浏览器就加载不出来,必须同一个浏览器下,因为cookies有效)
在这里插入图片描述


四、POST请求


django本身提供对csrf的校验功能,在django 1.4 版本之前 是需要手动开启,

在django的所有的post请求,都会在请求之初,给用户下发一个串用来校验身份的编码,并且每次请求下发的串都不一样,django的csrf 只针对post请求


1.django当中使用csrf的步骤


  1. 在settings文件中打开csrf相关验证
    在这里插入图片描述
  2. 在视图中返回页面,需要使用render(render_to_response),render第一个参数 是请求对象(request)如果不返回这个request,前端没法使用{% csrf_token %}
    在这里插入图片描述
  3. 在模板中的form表单域中添加 {% csrf_token %} 这个标签实际上 隐藏域,
    name是csrfmiddlewaretoken
    value是 csrf 校验的值
    在这里插入图片描述
    查看前端页面
    在这里插入图片描述

2.POST完成用户注册


目标: 通过前端提交用户名,密码,后端收到数据,保存数据库

  1. 完成模型的创建
    创建一个user表,字段 :用户名,密码
    在这里插入图片描述
    数据迁移
  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())

在这里插入图片描述


3.设置密码密文


加密: md5 不可逆的加密 通过md5实现密码加密


在这里插入图片描述
在这里插入图片描述


五、django form 表单类


表单功能在实际开发中,对数据的校验,获取数据。所谓数据的校验:包括对数据的长度,数据类型,是否为空,是否符合格式。针对数据的校验:前端校验,后端校验。

例如:用户名:长度的限制,特殊字符,用户名是否存在。

  • 前端校验
    • 通过js或者jq脚本对form表单提交的数据进行校验,
    • 优点: 形象,直观,减少服务器压力,有利于对用户提醒,用户体验比较好
  • 后端校验
    • 在视图当中,对要存储的数据进行校验,需要后端编写
    • 优点:安全性高,
    • 缺点: 服务器压力大,比较复杂

django前端校验可以通过校验框架进行校验,django推出form表单类来进行校验


1.定义form表单类


跟模型类相似
在这里插入图片描述


2.使用form表单类


在这里插入图片描述
form表单类是django定义的,可以自动生成前端form表单代码的一个表单类,已完成大部分校验功能。
常见的样式:
在这里插入图片描述
table样式:

as_table 被闲置,样式跟普通的样式一样,以前的布局使用table布局,现在用的div布局。table没有任何样式

3.修改table样式


在这里插入图片描述
django提供的form表单类中只提供了样式,没有form表单域,也没有提交按钮,优点:方便开发人员修改样式。如果要提交,外面包围一个form表单

<h3>自定义table样式</h3>
<div>
    <form action="" method="post">
    {% csrf_token %}
    <table>
        {% for one in regiter_form %}
        <tr>
            <th>
                {{ one.label }}
            </th>
            <td>
                {{ one }}
            </td>
        </tr>
        {% endfor %}
    <tr>
        <th>
            <input type="submit" value="提交">
        </th>
    </tr>
    </table>
    </form>
</div>


修改视图

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())

4.使用form表单类进行数据的校验通过字段属性进行校验


字段属性意义
max_length最大长度
min_length最小长度
required=True是否允许为空,默认为True,不可为空
labelform表单类的标签的内容
help_text帮助文档,有的浏览器显示不出来

form表单类,虽然能够完成前端校验,但是不用,form类经常被用来做后端校验


5.使用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>
  1. 视图
## 使用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())
  1. 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


6.form表单类的创建过程


  1. 创建一个forms.py文件,定义一个form表单类,类名(随意), 字段(字段属性)跟models写法相同,需要判断哪个字段,表单类添加哪个字段, 通过字段属性做前端数据校验
  2. 写一个视图,返回一个摸板类的实例对象,这个对象实际上提供了form表单(但是没有form标签)
  3. 写一个模板使用for循环,循环form表单类,增加form标签,然后获取数据,进行提交
  4. 视图获取数据,进行校验
    校验: 在form表单类中完成关于数据的校验
    成功: 返回成功
    失败:构建失败的提示,返回

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值