模板 类视图和中间件
2019-05-22 06:37:08来源:博客园 阅读 ()
模板和类视图
1. 在工程中创建模板目录templates。
然后修改settings.py配置文件中修改TEMPLATES配置项的DIRS值, 如下:
2. 定义模板
在templates新建一个index.html文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {{ city }} </body> </html>
3. 类视图的引入
在Django中也可以使用类来定义一个视图,称为类视图。
def register(request): """处理注册""" # 获取请求方法,判断是GET/POST请求 if request.method == 'GET': # 处理GET请求,返回注册页面 return render(request, 'index.html') else: # 处理POST请求,实现注册逻辑 return HttpResponse('这里实现注册逻辑')
使用类视图可以将视图对应的不同请求方式以类中的不同方法来区别定义。如下所示
from django.views.generic import View class RegisterView(View): """类视图:处理注册""" def get(self, request): """处理GET请求,返回注册页面""" return render(request, 'register.html') def post(self, request): """处理POST请求,实现注册逻辑""" return HttpResponse('这里实现注册逻辑')
类视图的好处:
- 代码可读性好
- 类视图相对于函数视图有更高的复用性, 如果其他地方需要用到某个类视图的某个特定逻辑,直接继承该类视图即可
4. 类视图的使用
定义类视图需要继承自Django提供的父类View,可使用from django.views.generic import View
或者from django.views.generic.base import View
导入,定义方式如上所示。
from django.views.generic import View class RegisterView(View): """类视图:处理注册""" def get(self, request): """处理GET请求,返回注册页面""" return render(request, 'register.html') def post(self, request): return render(request, 'index.html')
配置路由时,使用类视图的as_view()
方法来添加。
urlpatterns = [ # 视图函数:注册 # url(r'^register/$', views.register, name='register'), # 类视图:注册 url(r'^register/$', views.RegisterView.as_view(), name='register'), ]
5. 类视图原理
@classonlymethod def as_view(cls, **initkwargs): """ Main entry point for a request-response process. """ ...省略代码... def view(request, *args, **kwargs): self = cls(**initkwargs) if hasattr(self, 'get') and not hasattr(self, 'head'): self.head = self.get self.request = request self.args = args self.kwargs = kwargs # 调用dispatch方法,按照不同请求方式调用不同请求方法 return self.dispatch(request, *args, **kwargs) ...省略代码... # 返回真正的函数视图 return view def dispatch(self, request, *args, **kwargs): # Try to dispatch to the right method; if a method doesn't exist, # defer to the error handler. Also defer to the error handler if the # request method isn't on the approved list. if request.method.lower() in self.http_method_names: handler = getattr(self, request.method.lower(), self.http_method_not_allowed) else: handler = self.http_method_not_allowed return handler(request, *args, **kwargs)
总结:
URL里面调用as_view,调用dispatch方法,按照不同请求方式调用不同请求方法。最后返回真正的
函数视图View
6. 定义模板,模板渲染
1. 在templates目录中新建一个模板文件,如test.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>{{ city }}</h1> </body> </html>
2. 调用模板分为两步骤
1) 找到模板 loader.get_template(模板文件在模板目录中的相对路径) -> 返回模板对象
2) 渲染模板 模板对象.render(context=None, request=None) -> 返回渲染后的html文本字符串 context 为模板变量字典,默认值为None request 为请求对象,默认值为None
定义一个视图如下:
from django.http import HttpResponse from django.template import loader def test(request): # 1.获取模板 template = loader.get_template('test.html') context = {'city': '北京'} # 2.渲染模板 return HttpResponse(template.render(context))
返回:
上面代码可以简化,djangi提供了render函数
render(request对象, 模板文件路径, 模板数据字典)
from django.http import HttpResponse from django.template import loader # def test(request): # # 1.获取模板 # template = loader.get_template('test.html') # context = {'city': '北京'} # # 2.渲染模板 # return HttpResponse(template.render(context)) from django.shortcuts import render def test(request): context = {'city': '广州'} return render(request, 'index.html', context)
原文链接:https://www.cnblogs.com/py-web/p/10905654.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:定义函数
下一篇:Form和ModelForm组件
- 利用python自动生成verilog模块例化模板 2019-08-13
- JavaScript获取Django模板中指定键值的数据,使用过滤器 2019-08-13
- Django模板语言中静态文件路径的灵活写法 2019-07-24
- Django模板语言中的Filters的使用方法 2019-07-24
- Django框架之DRF 基于mixins来封装的视图 2019-07-24
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash