django视图层
视图层包含了Django的核心代码,它对外接收用户请求,对内调度模型层和模板层,统合数据库和前端。最后根据业务逻辑,将处理好的数据与前端结合,返回给用户。视图层是真正的后端。
URL路由系统
URL是Web服务的入口,用户通过浏览器发送过来的任何请求,都是发送到一个指定的URL地址,然后被响应。可以把URL视为web程序对外暴露的接口。
URL路由在Django中集中在url.py文件里。Django提倡项目有个根url.py,然后各子应用有各自的url.py,是一种解耦的模式。
Django处理用户请求的流程
- 决定要使用的URLconf模块。通常,这是
ROOT_URLCONF
设置的值,但我们也可以通过中间件自己设置url入口。 - 加载对应模块,并寻找可使用的urlpatterns
- 依次匹配url,在与请求的URL相匹配的第一个模式停下来。
- 导入并调用匹配行对应的views
- 如果没有匹配到正则表达式,或者过程中抛出异常,将调用一个适当的错误处理视图。
urlpatterns列表中的一条条url,每条url,都是urlpatterns列表的一个元素。先后顺序有重要关系,不能随意摆放,因其匹配用了短路模式。最后一条的末尾建议添加一个逗号
命名组
在Python的正则表达式中,命名组的语法是(?P<name>pattern)
,其中name是组的名称,pattern是要匹配的模式。例如:
url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
URLconf匹配请求url中的哪部分?
请求的URL被看做是一个普通的Python字符串,URLconf在其上查找并匹配。进行匹配时将不包括GET或POST请求方式的参数以及域名。
url捕获的参数是字符串类型
指定视图参数的默认值
举例来说
# URLconf from django.conf.urls import url from . import views urlpatterns = [ url(r'^blog/$', views.page), url(r'^blog/page(?P<num>[0-9]+)/$', views.page), ] # View (in blog/views.py) def page(request, num="1"): # Output the appropriate page of blog entries, according to num. ...
在这里,当路由捕获到匹配请求,会跳转到默认页码1。
路由转发
from django.conf.urls import include, url urlpatterns = [ # ... 忽略 ... url(r'^community/', include('django_website.aggregator.urls')), url(r'^contact/', include('django_website.contact.urls')), # ... 忽略 ... ]
路由转发使用的是include()方法,需要提前导入,它的参数是转发目的地路径的字符串,路径以圆点分割。请求是通过根路由url,转发到匹配到的子路径url中。
向路由传递额外参数
URLconfs具有一个钩子(hook),允许你传递一个Python字典作为额外的关键字参数给视图函数。
HttpRequest对象
用户请求发送过来,Django将HTTP数据打包成为HttpRequest对象,并传递给每个视图函数作为第一参数,即request。
类定义:class HttpRequest[source]
其属性大部分是只读的。
HttpRequest.FILES是用于上传文件的请求。
中间件可以设置自定义属性。
HttpResponse对象
HttpResponse类定义在django.http模块中。
HttpRequest对象由Django自动创建,而HttpResponse对象则由程序员手动创建.
我们编写的每个视图都要实例化、填充和返回一个HttpResponse对象。也就是函数的return值。
HttpResponse的子类
Django包含了一系列的HttpResponse衍生类(子类),用来处理不同类型的HTTP响应。与HttpResponse相同, 这些衍生类存在于django.http之中。
文件上传
Django在处理文件上传时,文件数据被打包封装在request.FILES中。
Django模型类对数据的增删改查
- 数据库配置好之后,在views引入模型类,这样就可以在views视图中对数据库进行增删改查
- 使用模型类名称.objects.all()便可以查找数据库全部的数据啦。objects是django中的模型类管理器,调用即可
- 修改数据可直接:模型类(模型类属性名="新的值'),然后再调用save方法便可以往数据库添加数据了。
- 获取某条数据:如果是指定某一条件,那么可以使用模型类中的get()方法,get里边就是条件,用delete方法可删除数据。查找之后可以这样来修改原来模型类属性的值,当然修改还是要save()的。
- 修改:filter也是可以查询到指定数据并且修改数据,但是它用update便可以修改了,不需要save,比get()更方便一点。
参考:http://www.liujiangblog.com/course/django/136