首页 > 其他分享 >Django3.2整站开发

Django3.2整站开发

时间:2022-10-05 11:23:58浏览次数:92  
标签:检索 DTL 模版 整站 html django 开发 context Django3.2

DTL模版引擎

模版配置

第一步:在项目配置文件中配置模版引擎相关的配置,Django默认引擎为DTL。
TEMPLATES = [
    {
      	# 配置模版引擎,默认使用Django Template Language(DTL).
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
      	# 配置全局模版(优先于应用模版),需要在项目根目录下创建一个用于存放全局模版文件的templates目录.
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
      	# 配置应用模版,为True时会自动去已配置安装的各应用包下的templates目录下搜索模版文件.
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

DTL快捷函数

$.模版渲染

# 快捷渲染函数render => from django.shortcuts import render
render(
  	request, 
  	template_name: str, 			# 模版名,如'index.html'
  	context: dict=None,				# 模版上下文,字典中的key将在模版中为全局变量
  	content_type=None, 				# MIME类型,不指定时默认为text/html; charset=utf-8
  	status=None, 							# 状态码,不指定时默认为200
  	using=None								# 加载模板时使用的模板引擎的名称
) -> HttpResponse

[模版处理2个步骤] render函数并不是真的渲染,渲染是浏览器完成的。render函数本质上就是将html模版的内容作为一个大字符串读取出来进行处理(填充context变量、格式化模版语法等),最后将处理完的html字符串包装为HttpReqponse实例并返回.

$.路由重定向

redirect(to, *args, permanent=False, **kwargs) -> Union[HttpResponsePermanentRedirect, HttpResponseRedirect]

[源码解析] redirect函数内部先通过resolve_url()函数对传入的路由名进行反向解析,然后进行永久性判断(permanent是否为True),永久性跳转构造并返回HttpResponsePermanentRedirect实例,否则构造并返回HttpResponseRedirect实例。

DTL模版语法

*.插值语法

{{ 变量名 }}						{# 注意: 调用某个对象的方法时,不要加小括号,否则会报错 #}

[注意] 若插值语法中的上下文变量通过属性访问运算符读取属性时,存在差异,用{{ foo.bar }}举例,检索顺序如下

(1) 字典检索. DTL引擎会先将foo作为字典,将bar作为字典的key进行检索,即foo["bar"]

(2) 成员检索. DTL引擎按字典检索失败后,会将foo作为对象,将bar作为属性或方法进行检索,即foo.bar

(3) 索引检索. DTL引擎按成员检索也失败后,会将foo当作序列,将bar作为数字索引进行检索,若还失败则用空串作为检索结果

*.流程控制

{# 模版标签: if语句 => 条件也支持and、or、not #}
{% if condition %} ... {% elif condition %} ... {% else %} ... {% endif %}

{# 模版标签: for循环 => 循环中还提供了一个循环变量forloop,其属性如下 #}
{# forloop参考: https://docs.djangoproject.com/en/3.2/ref/templates/builtins/ #}
{% for i in iterable %} ... {% endfor %}

*.内置组件

{{ 变量|过滤器名 }}								{# 单参过滤器本质上就是单参函数,管道符前面的值会被作为首参 #}
{{ 变量|过滤器名:"args" }}				{# 多参过滤器本质上就是多参函数,管道符前面的值会被作为首参 #}

*.模版继承

{# base.html (父模版) #}
{% block 块名 %} 块内容,可省略 {% endblock %}

{# index.html (子模版) #}
{% extends 'base.html' %}
{% block 块名 %} 当前块会替换父模版中的同名块 {% endblock %}
{% include 'xxx.html' %}    {# 导入模版,渲染时自动被替换为模版内容(代码替换) #}

DTL进阶功能

* 安全认证

CSRF安全认证: 需确保CsrfViewMiddleware中间件为激活状态,然后通过模版的csrf_token组件进行CSRF表单验证。

{% csrf_token %}								{# csrf_token用于跨站请求伪造保护,防止跨站攻击 #}

验证原理: {%csrf_token%}会被转化为一个名为scrfmiddlewaretoken的隐藏表单控件(即<input type="hidden" name="scrfmiddlewaretoken" value="token值" />)。首次请求站点时还会在Cookie中设置上该token值,当POST提交表单数据时,会自动将该控件中的token值一并提交,同时携带Cookie中的scrf_token值。然后Django中间件中进行比较,相符通过,不相符就触发403。本质也是双Cookie验证。

* 身份验证

Django的验证系统除了login、logout、authenticate方法外,还提供了@login_required和LoginRequireMixin做登陆判断,此二者本质上都是根据request.user的is_authenticated属性对登陆状态进行判断,使用方式如下

# 用于视图函数的登陆判断方式,认证失败自动重定向.
@login_required(login_url='/login/')
def my_view(request):
  	pass

# 用于视图类的登陆判断方式,认证失败自动重定向.
class MyView(LoginRequiredMixin, View):
  	login_url = '/login/'

* 缓存功能

缓存整个站点: https://docs.djangoproject.com/zh-hans/3.2/topics/cache/#the-per-site-cache

MIDDLEWARE = [
    'django.middleware.cache.UpdateCacheMiddleware',		# “update” 中间件必须在列表的第一位
    ...
    'django.middleware.cache.FetchFromCacheMiddleware',	# “fetch” 中间件必须在最后
]

缓存模版片段: https://docs.djangoproject.com/zh-hans/3.2/topics/cache/#template-fragment-caching

标签:检索,DTL,模版,整站,html,django,开发,context,Django3.2
From: https://www.cnblogs.com/SwordITC/p/16755270.html

相关文章

  • 多环境开发
         ......
  • 你帮我助软件开发-PSP
      设计思路    实现需求只需要一个简单的单向链表,通过添加、删除、查找、遍历等基本操作即可。  设计实现    用Struct记录物品的信息,name、ow......
  • 【nodejs开发】nodejs实现socket网络通信
    (本节内容如下:)1、简介在NodeJS中有三种socket:1.TCP,2.UDP,3.Unix域套接字。UDP/datagramsocketsClass:dgram.SocketEvent:'close'Event:'connect'Event:'erro......
  • ArcGIS Pro 二次开发内容对外出售,价格5千,并提供三个月在线QQ和微信辅导
    目录第1章          界面设置...9开发插件...9加入自己的选项卡...9自己的分组...10自定添加右键菜单-地图...10自定添加右键菜单-目录右键...11......
  • 分模块开发
         ......
  • 一道80%的前端开发都答不上来的js异步面试题
    最近面试中碰到了一道关于JS执行顺序的题目,题目比较基础,但是如果对于JS不熟的话,还是容易答不上来。再次记录和分析此次面试题,希望对大家有所帮助。asyncfunctiona......
  • XX学Python·mini web开发案例
    mini_web开发案例参考阶段三day07面对对象动态服务器importsocketimportthreadingimportjsonclassWebServer():def__init__(self):#一、创......
  • 开发网页状态码
    状态码,可根据以下标准按照项目扩展自身状态码:200~299段表示操作成功:200操作成功,正常返回201操作成功,已经正在处理该请求300~399段表示参数方面的异常300参数类型......
  • VScode Remote 远程开发与调试
    简介最近VScode发布了远程编程与调试的插件RemoteDevelopment,使用这个插件可以在很多情况下代替vim直接远程修改与调试服务器上的代码,同时具备代码高亮与补全功能,就和在本......
  • Asp-Net-Core开发笔记:集成Hangfire实现异步任务队列和定时任务
    前言最近把Python写的数据采集平台往.NetCore上迁移,原本的采集任务使用多进程+线程池的方式来加快采集速度,使用Celery作为异步任务队列兼具定时任务功能,这套东西用着还行......