57.2-Django之GET和POST调试、模板原理
总结:
- Django最常用的东西都涵盖了;
- 前后端分离:前端:JS、css、react;后端:Django 纯粹解决数据问题;
- ctrl+B 查看模块源代码;<hr> 横线
Django模板
如果使用react实现前端页面, 其实Django就没有必须使用模板, 它其实就是一个后台服务程序, 接收请求, 响应数据。接口设计就可以是纯粹的Restful风格。
WSGI server处理response转换为html是一个复杂的过程;网页主体模板大体是相似的,改变的是数据;
模板的目的就是为了可视化,将数据按照一定布局格式输出,而不是为了数据处理,所以一般不会有复杂的处理逻辑。模板的引入实现了业务逻辑和显示格式的分离,这样,在开发中,就可以分工协作,页面开发完成页面布局设计,后台开发完成数据处理逻辑的实现。
Python的模板引擎默认使用Django template language(DTL) 构建(语言)
采用postman调试 :请求方法Method
GET 请求获取URL对应的资源,请求的第一行(头、URL)
POST 提交数据至服务器端, post部分内容在body中;
HEAD 和GET类似,不过不返回消息response正文,只返回头部信息;
1.Get方法
查询字符串是通过get方法;
2. POST方法
CSRF解决安全问题;
CSRF报错关掉 MIDDLEWARE # django.middlewarre.csrff.CsrfViewMiddleware
id=100-&name=tom&name=jerry&name=ben 在 post / body中form-data 修改为
id:100
name:tom
name:jerry
name:ben
<QueryDict:{'id':['100'],'name':['tom','jerry','ben']}> #正确格式;
1. 模板配置
blog12/下新建templates目录,在settings.py中, 设置模板项目的路径;
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'templates')], # 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',
],
},
},
]
DIRS 列表,定义模板文件的搜索路径顺序
APP_DIRS 是否运行在每个已经安装的应用中查找模板。应用自己目录下有templates目录,例如、
django/contrib/admin/templates。如果应用需要可分离、可重用,建议把模板放到应用目录下
BASE_DIR 是 项目根目录,os.path.join(BASE_DIR, 'templates')就是在manage.py这一层建立一个目录
templates。这个路径就是以后默认找模板的地方。
2.模板渲染
模板页
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>首页</title>
</head>
<body>
<h1>欢迎您访问!</h1>
<p>我的数据部分。</p>
</body>
</html>
3. 模板处理
将request处理完成之后,生成一个上下文字典context,然后将这个字典凑到这个模板index中,形成一个大字符串,然后response给浏览器渲染;
2个步骤
1、加载模板
模板是一个文件,需要从磁盘读取并加载。要将模板放置在
2、渲染
模板需要使用内容数据来渲染,生成HTML文件内容
# urls
from django.template import loader
from django.template.backends.django import Template
from django.shortcuts import render
def index(request:HttpRequest):
"""视图函数:请求进来返回响应"""
# template:Template = loader.get_template('index.html') # 加载器搜索模块 并加载;
# print(type(template))
context = {'school':'magedu'} #正文字符串 数据传输
# html = template.render(context) # render拼接字符
# print(html)
# return HttpResponse(html.encode())
return render(request,'index.html',context,status=201)
urlpatterns = [
url(r'^admin/', admin.site.urls), # 正则表达式模式匹配
url(r'^$', index), # 以它开头、结尾的;
url(r'^index$', index), # 以 index开头 index1、index/ ;
# 两个不同的函数指向同一个问题url;不是多对多;
]
### blog12/templates/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>首页</title>
</head>
<body>
<h1>欢迎您访问!</h1>
<p>我的第一个段落。</p>
<hr>
{{school}} // 上下文字典的 key
</body>
</html>