Django请求
Posted markshui
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django请求相关的知识,希望对你有一定的参考价值。
一、Django请求
-
1、常见的请求方式
默认页面请求都是get请求
视图函数中request是传递到视图的请求,里面包含请求的各种参数常用的请求方式get和post:
-
get:默认是get请求,请求数据以明文形式放在路由上,get的格式是以?开头,键等于值的形式,以&来分割键值对,通常用于向服务器获取资源
https://www.baidu.com/s?wd=张三&rsv_spt=1 -
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 | 请求的来源 |
二、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=Falsecookie的操作
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数据存储到了数据库中。
设置sessionsession的操作
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,从数据库中找到了,但是过期了
以上是关于Django请求的主要内容,如果未能解决你的问题,请参考以下文章
django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段
django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段
VSCode自定义代码片段14——Vue的axios网络请求封装
VSCode自定义代码片段14——Vue的axios网络请求封装