Django 模板
模板语言渲染的整个过程其实就是将html转换成函数,并为该函数提供全局变量,然后执行该函数
模板应用实例
我们接着上一章节的项目将在 webTest 目录底下创建 templates 目录并建立 text.html文件,整个目录结构如下:


我们还需要在webTest下的settings.py文件下 找到TEMPLATES 配置项、将刚刚创建的模板文件夹、路径指向具体的templates路径、这样django才能找到HTML模板位置:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, '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',
],
},
},
]
我们现在修改 views.py,增加一个新的视图方法,用于向模板提交数据:
def text(request):
context = {}
context['data'] = '一个测试前沿的布道者、立志成为一个全栈测试开发'
return render(request, 'text.html', context)
render()
此方法的作用---结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。
通俗的讲就是把context的内容, 加载进templates中定义的文件, 并通过浏览器渲染呈现.
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Django 模板引擎演示</title>
</head>
<body>
<p>
{{ data }} #用二个花括号进行来输出后端的数据变量值、类似于vue.js、文本插值
</p>
</body>
</html>
urls.py
urlpatterns = [
path('admin/', admin.site.urls), #后台系统的url地址一般生产都会进行修改该路径为了安全起见
path('test/', test_list),#直接输入对应的方法名称、无需带括号
path('test/<name>/', test_case),
path('text/', text),
]
浏览器展示

上面的演示也太low了、再来个带前端交互的吧?
创建一个login.html文件、由于没有数据库就用写死的认证数据进行演示。

html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form action="/login/" method="post">
{# action 需要指定的是后端的urls配置的url规则 、相当于该表单数据需要提交到哪里去处理#}
{# method 请求的方法#}
<table>
<tbody>用户登录</tbody>
<tr>
<td>
<label for="username">用户名:</label>
</td>
<td>
<input type="text" name="username">
</td>
</tr>
<tr>
<td>
<label for="username">密码:</label>
</td>
<td>
<input type="password" name="pwd">
</td>
</tr>
<tr>
<td>
<input type="reset" value="重置">
</td>
<td>
<input type="submit" value="登录">
</td>
</tr>
</table>
</form>
</body>
</html>
urls.py
urlpatterns = [
path('admin/', admin.site.urls), #后台系统的url地址一般生产都会进行修改该路径为了安全起见
path('test/', test_list),#直接输入对应的方法名称、无需带括号
path('test/<name>/', test_case),
path('text/', text),
path('login/', userlogin),
path('index/', index),
]
view.py
# 用户进入登录界面
def index(request):
return render(request, 'login.html')
# 登录的业务逻辑处理
def userlogin(request):
username = request.POST.get("username") #获取前端html表单中的name属性名称
pwd = request.POST.get("pwd")
return HttpResponse("登录成功 %s 用户"%username)
浏览器预览
输入 http://127.0.0.1:8000/index/ 会直接跳转到login界面

输入用户名密码、然后点击登录

如果出现这种情况我们需要在settings中将一个表单验证的中间件给他注释掉、这个是django为安全考虑的、在使用表单提交数据实时需要通过认证字段进行认证告知后端这个请求是安全的、我们这先不考虑这些问题、直接去注释下面内容即可正常。

CSRF 攻击

我们再来试试

正常了、我们可以看后端的视图函数没有写任何逻辑问题、下面我们将登录的业务逻辑补充下:
# 登录的业务逻辑处理
def userlogin(request):
username = request.POST.get("username") #获取前端html表单中的name属性名称
pwd = request.POST.get("pwd")
# 如果用户名等于admin 且密码等于123456时登录成功
if username == "admin" and pwd == "123456":
return HttpResponse("登录成功 %s 用户"%username)
else:
return HttpResponse("用户名或密码错误")
我们用户名输入admin、密码为空时

上面的提示总感觉少了点上面、我们需要控制如果用户某个表单为空我们就提示什么不能为空?
我们在增加些逻辑:
# 登录的业务逻辑处理
def userlogin(request):
username = request.POST.get("username") #获取前端html表单中的name属性名称
pwd = request.POST.get("pwd")
# username与pwd都不为空时执行
if all([username,pwd]):
# 如果用户名等于admin 且密码等于123456时登录成功
if username == "admin" and pwd == "123456":
return HttpResponse("登录成功 %s 用户"%username)
else:
return HttpResponse("用户名或密码错误")
else:
return HttpResponse("用户名或密码不能为空")
继续密码为空或者用户名为空

什么业务逻辑还是正常的、那么输入正常的用户名和密码试试:

其实模板语法有很多、这里不太仔细一一演示了。下节直接进入ORM模型讲解!!!
拒绝白嫖,不给钱就点赞分享、关注、加在看吧!!!





