Django请求

1,328 阅读6分钟

一、Django请求

  • 1、常见的请求方式

    默认页面请求都是get请求 视图函数中request是传递到视图的请求,里面包含请求的各种参数

    常用的请求方式get和post:

    • get:默认是get请求,请求数据以明文形式放在路由上,get的格式是以?开头,键等于值的形式,以&来分割键值对,通常用于向服务器获取资源 www.baidu.com/s?wd=张三&rsv…

    • post:请求数据隐藏发送,安全系数更高。通常用于向服务器提交资源

  • 2、请求对象

​ 视图函数中request是传递到视图的请求对象,包含了本次请求所有的信息

def index(request):
    return render(request, "index.html")

request对象的类型是django.http.HttpRequest,常用属性如表所示:

方法 说明
request.GET 获取get请求数据的方法
request.POST 获取post请求数据的方法
request.FILES 获取文件上传请求数据的方法
request.method 获取请求的方法
request.META 请求的详细参数
request.META.OS 请求端系统
request.META.HTTP_USER_AGENT 用户请求头,返回请求浏览器版本
request.META.HTTP_HOST 请求的主机
request.META.HTTP_REFERER 请求的来源

二、CSRF

跨站请求伪造,是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法

在社交工程的一点帮助下(例如通过电子邮件或聊天发送链接), 攻击者可能会诱骗Web应用程序的用户执行攻击者选择的操作

三、Django表单

  • HTML表单

    属性 说明
    action 提交的地址,默认是当前路由
    method 提交的方法,默认是get
    name 用来做传参的标识
    submit 会自动提交当前表单的数据
  • 后端处理

    def register(request):
        """注册"""
        if request.method == "GET":  # GET跳转页面
            return render(request, "register.html")
        else:  # POST处理提交
            # 获取参数
            name = request.POST.get("name")
            password = request.POST.get("password")
            # 创建对象并新增
            # Seller.objects.create(
            #     name=name,
            #     password=encryption_md5(password)
            # )
            # 创建对象
            seller = Seller()
            seller.name = name
            seller.password = encryption_md5(password)
            # 新增
            seller.save()
            # 响应
            return HttpResponse("注册成功")
    
  • 注释掉CSRF 中间件 CSRF跨站请求伪造:使用当前浏览器还在生效状态的cookie对指定网站进行操作。最初针对的是银行网站的转账

  • 在Django的任何post请求,都会在请求之初,给用户下发一下串用来校验身份的编码,并且每次请求不一样,如果不加CSRF校验,会发生CSRF错误

  • 使用Django的CSRF校验

    1、返回post登陆页面的时候要用render方法,render方法和render_to_response方法的功能类似,但是会在第一个参数返回request,如果不返回request,前端无法调用 {% csrf_token %}

    在form表单内部的第一行,插入CSRF 校验,使用{% csrf_token %}

四、Django表达类

  • 表单类介绍

    用户表单是Web端的一项基本功能,大而全的Django框架中自然带有现成的基础Form对象 Form表单的功能:

    1、自动生成HTML表单元素

    2、检查表单数据的合法性(后端验证)

    3、如果验证错误,重新显示表单(数据不会重置)

    4、数据类型转换(字符类型的数据转换成相应的Python类型)

    Django表单类,带有前后端验证的 1、前端验证: Django表单类对象渲染到模板后,会变成HTML附带属性标签,这些是属性一般是HTML5的属性,可以交互

    from django import forms from django.core.validators import RegexValidator,ValidationError

    (1)、创建表单类

    from django import forms
    from django.core.validators import ValidationError, RegexValidator
    
    
    class LoginForm(forms.Form):
        """登录验证的表单类"""
        name = forms.CharField(
            required=True,
            max_length=10,
            min_length=2,
            error_messages={
                "required":"用户名必填",
                "max_length":"用户名不能超过十位",
                "min_length":"用户名至少是两位"
            })
        password = forms.CharField(
            required=True,
            error_messages={
                "required": "密码必填",
            })
    

    (2)、模板页面

    <div class="form-group">
    <input type="text" class="form-control form-control-user" name="name" id="username" placeholder="用户名" value="{{ login_form.data.name }}">
    <label>{{ login_form.errors.name.0 }}</label>
    </div>
    

    (3)、视图

    
    def login(request):
        """登录"""
        login_form = LoginForm()
        if request.method == "GET":  # GET跳转页面
            return render(request, "login.html", locals())
        else:  # POST处理提交
            # 获取参数,放入表单校验
            login_form = LoginForm(request.POST)
            # 判断校验是否成功
            if login_form.is_valid():  # 验证成功
                # 获取参数
                name = login_form.cleaned_data.get("name")
                password = login_form.changed_data("password")
                # 查询
                seller = Seller.objects.filter(name=name, password=encryption_md5(password)).first()
                # 判断
                if seller:
                    return redirect("/index/")
                else:
                    return redirect("/login/")
            else:
                return render(request, "login.html", locals())
    

五、Django 表单校验

在验证某个字段的时候,可以传递一个validators参数用来指定验证器,进一步对数据进行过滤验证器有很多,但是很多验证器我们其实已经通过这个Field或者一些参数就可以指定了

比如EmailValidator,我们可以通过EmailField来指定,比如MaxValueValidator,我们可以通过max_value参数来指定

以下是一些常用的验证器:

验证器 描述
MaxValueValidator 验证最大值
MinValueValidator 验证最小值
MinLengthValidator 验证最小长度
MaxLengthValidator 验证最大长度
EmailValidator 验证是否是邮箱格式
URLValidator 验证是否是URL格式
RegexValidator 正则表达式的验证
  • 自定义校验

    Django表单类也提供了对特定字段的自定义验证,在Form类中定义实例方法,方法名字是"clearn_验证的字段名",如果验证失败,抛出ValidationError异常,否则正常返回值

    在前端可以回显异常信息

  • forms.py

    # 自定义验证器
    class MyValidator:
        def __call__(self, value):
            """
            自定义验证
            :param value: value表示要验证的数据
            :return: 如果ValidationError表示验证失败 正常结束表验证通过
            """
            datas = ["sb", "xx"]
            for data in datas:
                if value.find(data) != -1:
                    raise ValidationError("用户名不能含有敏感词汇")
    
                    
    class RegisterForm(forms.Form):
        """注册验证的表单类"""
        name = forms.CharField(
            required=True,
            validators=[
                # 2-10位的字符数字下划线
                RegexValidator(r"^[a-zA-Z0-9_]{2,10}$", "用户名只能是长度2-10位字母数字下划线"),
                # 自定义验证器
                MyValidator()
            ],
            error_messages={
                "required": "用户名必填",
            }
        )
        password = forms.CharField(
            required=True,
            error_messages={
                "required": "密码必填"
            }
        )
    
    
      #### 五、Django会话机制
    
  • cookie

    设置时间:默认是用的UTC,与当前我们本地时间错了8小时。 TIME_ZONE=’Asia/Shanghai’ USE_TZ=False

    cookie的操作

    response获取的方式有: (1) response = HttpResponse(“xx”) (2) response = render(request,”xx.html”) (3) response = redirect(“/index”)

    1、创建cookie response.set_cookie(键,值,有效期) 有效期单位是秒

    2、删除cookie response.delete_cookie(键)

    3、获取cookie request.cookie.get(键)

  • sesison

    session是基于cookie实现的。 Django中默认配置把session数据存储到了数据库中。 设置session

    session的操作

    1、创建session request.session[键] = 值 有效期默认是2周 可以修改 request.session.set_expiry(时间)单位是秒

    2、获取session request.session.get(键)

    3、删除session del request.session[键] 删除一个键值对 request.session.clear() 删除所有键值对

    想想服务器获取不到session有几种情况:

    1、客户端没有发来sessionid 2、客户端发来sessionid,但是从数据库中找不到 3、客户端发来sessionid,从数据库中找到了,但是过期了