Django(重拾)
MTV模型
Model(模型):负责业务对象与数据库的对象(ORM)
Template(模版):负责如何把页面展示给用户
View(视图):负责业务逻辑,并在适当的时候调用Model和Template
此外,Django还有一个urls分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template
视图层之路由配置系统(views)
URL配置:本质是URL与要调用该URL的视图建立的映射表 你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码
''' urlpatterns = [ url(正则表达式, views视图函数,参数,别名), ] 参数说明: 一个正则表达式字符串 一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串 可选的要传递给视图函数的默认参数(字典形式) 一个可选的name参数 '''
url的正则字符串参数
无名分组:按位置传参给视图函数
urlpatterns = [ url(r'^articles/2003/$', views.special_case_2003), url(r'^articles/([0-9]{4})/$', views.year_archive), url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive), url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail), ]
''' NOTE: 一旦匹配成功则不再继续 若要从URL 中捕获一个值,只需要在它周围放置一对圆括号。 不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。 每个正则表达式前面的'r' 是可选的但是建议加上。 一些请求的例子: /articles/2005/3/ 不匹配任何URL 模式,因为列表中的第三个模式要求月份应该是两个数字。 /articles/2003/ 将匹配列表中的第一个模式不是第二个,因为模式按顺序匹配,第一个会首先测试是否匹配。 /articles/2005/03/ 请求将匹配列表中的第三个模式。Django 将调用函数 views.month_archive(request, '2005', '03')。 '''
有名分组:按关键字传参给视图函数
在更高级的用法中,可以使用命名的正则表达式组来捕获URL 中的值并以关键字 参数传递给视图。
在Python 正则表达式中,命名正则表达式组的语法是(?P<name>pattern)
,其中name
是组的名称,pattern
是要匹配的模式。
from django.conf.urls import url from . import views urlpatterns = [ url(r'^articles/2003/$', views.special_case_2003), url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive), url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive), url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail), ]
捕获的值作为关键字参数而不是位置参数传递给视图函数。例如: /articles/2005/03/ 请求将调用views.month_archive(request, year='2005', month='03')函数 /articles/2003/03/03/ 请求将调用函数views.article_detail(request, year='2003', month='03', day='03')。
URLconf 在请求的url上查找,不包括GET和POST参数以及域名
例如,http://www.example.com/myapp/ 请求中,URLconf 将查找myapp/。 在http://www.example.com/myapp/?page=3 请求中,URLconf 仍将查找myapp/。 URLconf 不检查请求的方法。换句话讲,所有的请求方法 —— 同一个URL的POST、GET、HEAD等等 —— 都将路由到相同的函数。
URLconf根据正则表达式在请求的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"): ... 在上面的例子中,两个URL模式指向同一个视图views.page —— 但是第一个模式不会从URL 中捕获任何值。如果第一个模式匹配,page() 函数将使用num参数的默认值"1"。 如果第二个模式匹配,page() 将使用正则表达式捕获的num 值。
路由分发:一个项目的各个应用进行解耦,如果所有的urlconf都在一个总的urls文件中,若其中有一条url报错则整体应用程序报错,所以把各大类的url放在项目的总urls中,把每个大类中自己的urls放在自己的应用中
###### #项目中的urls文件: from django.conf.urls import url,include urlpatterns = [ url(r'^app01/',include('app01.urls')), ] ###### #各应用中的urls文件: from django.conf.urls import url from app01 import views urlpatterns = [ url(r'^art/(1000)/', views.art), url(r'^art/(?P<num>\d{4})/$', views.art), ] ##### http://127.0.0.1:8000/app01/art/1012/
传递额外的选项给视图函数:传递一个Python 字典作为额外的参数传递给视图函数
django.conf.urls.url()
函数可以接收一个可选的第三个参数,它是一个字典,表示想要传递给视图函数的额外关键字参数。
####### app应用urls中 from django.conf.urls import url from app01 import views urlpatterns = [ url(r'^art/(1000)/', views.art,{"foo":",123"}), ] #对于/app01/art/1000/请求,Django 将调用views.art(request, num='1000', foo=',123')。 ###### views视图中 def art(request,num,foo): return render(request, "art.html", {"day": num+foo}) ###### web请求 127.0.0.1:8000/app01/art/1000/
这个技术在Syndication 框架中使用,来传递元数据和选项给视图。
URL的反向解析: URLconf中的name参数
####urls from django.conf.urls import url,include from app01 import views urlpatterns = [ url(r'^art/', views.art3, name='app01-art'), ] ####views def art3(request): return render(request,"art.html",{"day":"abc"}) ####art.html <h1>{{ day }}</h1> <a href="{% url 'app01-art' %}">点击</a> ####web 127.0.0.1:8000/art/ 若想更改url 需要在urls中更改url函数中的正则表达式,则a标签中的url也会更改
视图层之视图函数(views)
HttpRequest对象的属性
HttpRequest.path
一个字符串,表示请求的路径组件(不含域名) 例如请求: /art/adsf/?a=1 print(request.path) /art/adsf/ print(request.path_info) /art/adsf/ print(request.get_full_path()) /art/adsf/?a=1
HttpRequest对象的属性与方法
详见:http://www.cnblogs.com/yuanchenqi/articles/7629939.htm
redirect函数
参数可以是: ◾一个模型:将调用模型的get_absolute_url() 函数 ◾一个视图,可以带有参数:将使用urlresolvers.reverse 来反向解析名称 ◾一个绝对的或相对的URL,将原封不动的作为重定向的位置。 默认返回一个临时的重定向;传递permanent=True 可以返回一个永久的重定向。
redirect() 函数中可以传递一个对象,传递一个视图的名称,传递一个要重定向的一个硬编码的URL
####传递一个对象 将调用get_absolute_url() 方法来获取重定向的URL: from django.shortcuts import redirect def my_view(request): object = MyModel.objects.get(...) return redirect(object) ####传递一个视图的名称 可以带有位置参数和关键字参数;将使用reverse() 方法反向解析URL: def my_view(request): return redirect('some-view-name', foo='bar') ####传递要重定向的一个硬编码的URL def my_view(request): return redirect('/some/url/') 也可以是一个完整的URL: def my_view(request): return redirect('http://example.com/') 默认情况下,redirect() 返回一个临时重定向。以上所有的形式都接收一个permanent 参数;如果设置为True,将返回一个永久的重定向: def my_view(request): object = MyModel.objects.get(...) return redirect(object, permanent=True)
redirect函数的重定向
login登录验证,登录后跳转到index
模板层(template)
python的模板:HTML代码+模板语法
模版包括在使用时会被值替换掉的 变量,和控制模版逻辑的 标签。
HTML中的模板语言:
渲染变量:{{ }}
语法逻辑:{% %}
深度查询 :句点符
渲染在HTML中的数据可以根据数据类型: .索引 ---> 对于列表 .键名 ---> 对于字典 .对象属性、类属性 ---> 对于对象 .对象方法(只限无传参的方法) ---> 对于对象 可以多点: .索引.键名.属性