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/
View Code

这个技术在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也会更改
View Code

视图层之视图函数(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中的数据可以根据数据类型:
.索引   ---> 对于列表
.键名   ---> 对于字典
.对象属性、类属性   ---> 对于对象
.对象方法(只限无传参的方法)   ---> 对于对象
可以多点:  .索引.键名.属性

 

posted @ 2018-06-28 15:50  程先生_Python  阅读(83)  评论(0编辑  收藏  举报