一、常见的请求方式html
默认页面请求都是get请求 视图函数中request是传递到视图的请求,里面包含请求的各类参数前端
经常使用的请求方式get和post:python
get:默认是get请求,请求数据以明文形式放在路由上,get的格式是以?开头,键等于值的形式,以&来分割键值对,一般用于向服务器获取资源 www.baidu.com/s?wd=张三&…正则表达式
post:请求数据隐藏发送,安全系数更高。一般用于向服务器提交资源数据库
二、请求对象django
视图函数中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 | 请求的来源 |
跨站请求伪造,是一种挟制用户在当前已登陆的Web应用程序上执行非本意的操做的攻击方法安全
在社交工程的一点帮助下(例如经过电子邮件或聊天发送连接), 攻击者可能会诱骗Web应用程序的用户执行攻击者选择的操做服务器
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校验
一、返回post登录页面的时候要用render方法,render方法和render_to_response方法的功能相似,可是会在第一个参数返回request,若是不返回request,前端没法调用 {% csrf_token %}
在form表单内部的第一行,插入CSRF 校验,使用{% csrf_token %}
表单类介绍
用户表单是Web端的一项基本功能,大而全的Django框架中天然带有现成的基础Form对象 Form表单的功能:
一、自动生成HTML表单元素
二、检查表单数据的合法性(后端验证)
三、若是验证错误,从新显示表单(数据不会重置)
四、数据类型转换(字符类型的数据转换成相应的Python类型)
Django表单类,带有先后端验证的 一、前端验证: 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())
复制代码
在验证某个字段的时候,能够传递一个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": "密码必填"
}
)
复制代码
#### 5、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”)
一、建立cookie response.set_cookie(键,值,有效期) 有效期单位是秒
二、删除cookie response.delete_cookie(键)
三、获取cookie request.cookie.get(键)
sesison
session是基于cookie实现的。 Django中默认配置把session数据存储到了数据库中。 设置session
session的操做
一、建立session request.session[键] = 值 有效期默认是2周 能够修改 request.session.set_expiry(时间)单位是秒
二、获取session request.session.get(键)
三、删除session del request.session[键] 删除一个键值对 request.session.clear() 删除全部键值对
想一想服务器获取不到session有几种状况:
一、客户端没有发来sessionid 二、客户端发来sessionid,可是从数据库中找不到 三、客户端发来sessionid,从数据库中找到了,可是过时了