admin 管理员组

文章数量: 1184232

WEB后端服务第15天

WEB后端服务第15天-Django第五天

一、csrf (防止跨站请求伪造)

1.1 {% csrf_token %} 标签

在 模板的<form>内部使用即可,会生成隐藏字段, 名称为csrfmiddlewaretoken, 它的值是在渲染板块是产生的,并存储在session, 当表单提交到后端时,通过csrfMiddleWare中间件验证。

 <form class="form" method="post">{% csrf_token %}
</form>

注意: 只针对post请求

扩展1: make_password和check_password

django.contrib.auth.hashers.make_password
django.contrib.auth.hashers.check_password

扩展2: request.session

session是字典类型

1.2 取消csrf

  • 在settings.py的中间件的配置中,将CsrfViewMiddleware删除
  • @csrf_exempt装饰view处理函数
django.views.decorators.csrf.csrf_exempt

二、模板布局标签

2.1 block/extends/include

2.2 显示父模板的内容

{{ block.super }}

三、app模块内部模板

  • 每个app下都可以增加templates目录,存放它自己的模板文件
  • 内部的模板templates目录,不需要在settings.py中设置
  • 如果app模块之外存在templates目录,且在settings.py中已设置,则加载模板时,则优先从此目录中加载模板文件。

四、URL路由配置

4.1 URL分二级(总路由和子路由(app模块的路由))

  • 主工程目录下urls.py
urlpatterns = [path('url',  视图函数, name=None),path('url/', include('app_label.urls',  namespace=None))  # 包含子路由
]
  • app目录下的urls.py
urlpatterns = [path('url',  视图函数, name=None),
]

include的namespace和path的name都在反向解析中使用, 即反向获取url路径: ‘namespace.name’

4.2 url和path两种路由的配置

url()配置兼容Django1.x 的老版本

path() 是Django2之后的路由函数。

from django.urls import path
from django.conf.urls import urlfrom orderapp import viewsurlpatterns = [path('list', views.order_list),url(r'^list2$', views.order_list)
]

url()支持正则, 通过正则在url路径中向处理函数传参:

url(r'^list2/(?P<city_code>\w+)/(?P<order_num>\d+)$', views.order_list)

以上是按关键传参方式。也可以按位置传参(从左到右),如下所示

url(r'^list2/(\w+)/(\d+)$', views.order_list)
def order_list(request, order_num, city_code):print(order_num, city_code)return render(request,'list_order.html',locals())

以上的url路由传参可以使用path()的<name>实现, 如:

 path('list/<city_code>/<order_num>', views.order_list),

如果路由中的参数是uuid类型,则使用参数转换器进行匹配, 如

path('cancel/<uuid:order_num>', views.cancle_order),

除了uuid转换器之外, 还有str, int, slug。如果路由中参数的规则较复杂时,建议使用re_path()配置路由中的参数

 re_path(r'^search/(?P<phone>1[3-57-9][\d]{9})$', views.search)
def search(request, phone):return HttpResponse('hi, phone: %s' % phone)

五、反向解析

5.1 使用include的namespace和path的name属性

主路由

path('order/', include('orderapp.urls', namespace='order')),

子路由内容如下:

app_name = 'orderapp'urlpatterns = [path('list/<city_code>/<order_num>', views.order_list, name='list'),path('cancel/<uuid:order_num>', views.cancle_order, name='cancel'),re_path(r'^search/(?P<phone>1[3-57-9][\d]{9})$', views.search, name='search')# url(r'^list2/(?P<city_code>\w+)/(?P<order_num>\d+)$', views.order_list)
]

【注意】如果子路由指定了namespace命名空间, 则子路由的脚本中必须声明"app_name"属性,属性一般是app模块名称。

5.2 在网页中获取路径

在网页中使用 {% url ‘namespace或app_name:name’ 参数 %}

<p><a href="{% url 'orderapp:list' 'xa' 1001 %}">订单</a>
</p>

参数可以是多个,每个参数之间使用空格分隔。

参数默认使用位置传参, 也可以使用关键参数传参。

<p><a href="{% url 'orderapp:list' order_num=1002 city_code='xa' %}">订单</a>
</p>

5.3 在视图函数中获取路径

在视图函数中,使用reverse()函数来反向获取url请求路径。 再通过redirect或HttpResponseRedirect()来重定向。

url = reverse('order:search',args=('17791692077',))
return redirect(url)
url = reverse('order:list',kwargs=dict(city_code='ShangXiXiaan', order_num=11009))
return HttpResponseRedirect(url)
  • reverse()可以使用kwargs字典类型传参, 也可以使用args以位置方式传参。

  • HttpResponseRedirect()和redirect()是一样的, 即redirect()返回就是HttpResponseRedirect类对象。

六、自定义error视图模板

常见的错误的响应状态码: 403, 400, 404, 405 请求方法不允许, 500 (服务器异常)

在templates模板中定义404.html或500.html, 要求将settings.py的DEBUG设置为False。

404.html

{% extends 'base.html' %}
{% block content %}<h3 style="color:red">Sorry, 您请求的资源{{ request_path }}<script>document.write(window.location.href)</script> 不存在</h3><p>3秒之后自动跳转到<a href="/">主页</a></p>{% endblock %}

七、模型类扩展知识点

7.1 validators验证

如果验证不通过,可以抛出ValidationError信息

from django.core.exceptions import ValidationError

自定义验证器类(用于模型类字段的):

class UserValidator:@classmethoddef valid_phone(cls, value):if not re.match(r'1[1-57-9]\d{9}', value):raise ValidationError('手机格式不正确')return True
class UserEntity(models.Model):name = models.CharField(max_length=20,verbose_name='账号')age = models.IntegerField(default=0,verbose_name='年龄')phone = models.CharField(max_length=11,verbose_name='手机号',validators=[UserValidator.valid_phone],blank=True,  # 站点的表单字段值可以为空null=True)  # 数据表的字段可以是null值

在model.CharField(validators=[]) 指定哪些验证方法。

7.2 QuerySet的bulk_create([]) 批量创建

c1 = CateTypeEntity()
c1.name='水果1'
c1.order_num = 10c2 = CateTypeEntity()
c2.name = '水果2'
c2.order_num = 11CateTypeEntity.objects.bulk_create([c1, c2])

7.3 QuerySet.values()或values_list()返回指定字段

UserEntity.objects.values('id', 'name')  # 只查看id和name两个字段
<QuerySet [{'id': 1, 'name': 'disen'}, {'id': 2, 'name': 'jack'}, {'id': 3, 'name': '王栋平'}, {'id': 7, 'name': '罗鹏'}, {'id': 8, 'name': '李晨西'}, {'id': 10, 'name': '疾风剑豪亚索'}, {'id': 11, 'name': 'lucy'}]>

7.4 request请求对象的属性

GET/POST/COOKIES/FILES 都是QueryDict类,QueryDict自动进行url的中文编码处理。

method, path, content_type, encoding, session

本文标签: WEB后端服务第15天