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 服务端错误
502 bad gateway 服务器错误,代理有问题

3.请求request对象的方法


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):
    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,不可为空
label form表单类的标签的内容
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表单类中完成关于数据的校验
    成功: 返回成功
    失败:构建失败的提示,返回

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐