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天
版权声明:本文标题:WEB后端服务第15天 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.roclinux.cn/b/1693755383a240939.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论