URL路由
对于高质量的Web 应用来说,使用简洁、优雅的URL路由是一个非常值得重视的细节。Django 让你随心所欲设计你的URL,不受框架束缚。为了给一个应用设计URL,你需要创建一个Python 模块,通常称为URLconf(URL configuration)。这个模块是纯粹的Python 代码,包含URL 模式(简单的正则表达式)到Python 函数(你的视图)的简单映射。
Django 如何处理一个请求
1. django 加载 ROOT_URLCONF 指定的模块,并寻找可用的urlpatterns.它是django.conf.urls.url() 实例的一个Python 列表。
2. Django 依次匹配每个 URL,在与请求的URL 匹配的第一个url停下来
3. 一旦其中的一个正则表达式匹配上,Django 将导入并调用给出的视图,它是一个简单的
Python 函数(或者一个基于类的视图)。视图将获得如下参数:
参数一:一个HttpRequest 实例。
参数二:如果匹配的正则表达式返回了没有命名的组,那么正则表达式匹配的内容将作为位置参数提供给视图。
参数三:关键字参数由正则表达式匹配的命名组组成,但是可以被 django.conf.urls.url() 的可选参数kwargs覆盖。
4. 如果没有匹配到正则表达式,或者如果过程中抛出一个异常,Django 将调用一个适当的错误处理视图:handler404, handler500, handler403, handler400
URLconf
URLconf是一个python模块,是一个URL模式(简单正则表达式)到Python函数(视图)之间的映射
urlpatterns
urlpatterns 是一个 url() 实例类型的Python 列表。
urlpatterns 中的每个正则表达式在第一次访问它们时被编译
url函数
url(regex, view, kwargs=None, name=None)
regex: 一个字符串(原始字符串)或简单的正则表达式
view: view参数是一个视图函数或as_view()的结果(基于类的视图)
kwargs: 传递额外的参数给视图
name: url名称
include
include(module, namespace=None, app_name=None)
include(pattern_list)
include((pattern_list, app_namespace), namespace=None)
include((pattern_list, app_namespace, instance_namespace))
module: URLconf模块
namespace:URL命名空间
app_name: app的命名空间
pattern_list: 可迭代的django.conf.urls.url()实例
app_namespace: 应用的命名空间
instance_namespace: 实例的命名空间
include 示例
示例1:
urlpatterns = [
url( r'^$', RedirectView.as_view(url="/dashboard/")),
url(r'^dashboard/', include("dashboard.urls")),
url(r'^accounts/', include("accounts.urls")),
url(r'^admin/', admin.site.urls),
]
示例2:
urlpatterns = [
url(r"^user/", include([
url(r'^list/$', view.userlist, name="user_list"),
url(r'^info/$', view.userinfo, name="userer_inf),
url(r'^modify/', include([
url(r'status/$',view.modifystatus, name="user_modify_status"),
]))
]))
]
url参数—位置参数
若要从URL 中捕获一个值,只需要在它周围放置一对圆括号。
from django.conf.urls import url
from . import views
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),
]
请求地址:/articles/2003/03/03/
调用函数:views.article_detail(request, "2003", '03', '03')
url参数——关键字参数
语法:
(?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[0-9]{4})/$', views.year_archive),
url(r'^articles/(?P[0-9]{4})/(?P[0-9]{2})/$', views.month_archive),
url(r'^articles/(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2})/$', views.article_detail),
]
请求地址:/articles/2003/03/03/
调用函数:views.article_detail(request, year='2003', month='03', day='03').
url参数——额外参数
URLconfs 具有一个钩子,让你传递一个Python 字典作为额外的参数传递给视图函数
django.conf.urls.url() 函数可以接收一个可选的第三个参数,它是一个字典,表示想要传递
给视图函数的额外关键字参数
示例:
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^blog/(?P[0-9]{4})/$', views.year_archive, {'foo': 'bar'}),
]
请求地址:/blog/2005/
调用函数:views.year_archive(request, year='2005',foo='bar')
URL反向解析
django给每个URL取了一个名字,存储每个URL与name的映射关系
根据Django 视图的标识和将要传递给它的参数的值,获取与之关联的URL。这种方式叫做
反向解析URL、反向URL匹配、反向URL查询或者简单的URL反查。
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),
]
视图中使用:
from django.core.urlresolvers import reverse
year = 2006
return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))
模板中使用:
<a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a>
基于类的视图
视图是一个可调用的对象,它接收一个请求然后返回一个响应,这个可调用对象可以不只
是函数,Django提供一些可以用作视图的类。
基于类的视图使用Python 对象实现视图,它提供除函数视图之外的另外一种方式。
View
属性:
http_method_names
方法:
as_view()
dispatch()
http_method_not_allowed()
类视图登陆验证
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
class FooView(View):
@method_decorator(login_required)
def get(request, *args, **kwargs):
return HttpResponse("hello world")
数据分页
分页
Paginator对象
Page对象
Paginator
class Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True)
Required arguments
- object_list
- per_page
Optional arguments
- orphans
- allow_empty_Òrst_page
属性
- Paginator.count 所有页面的objects总数
- Paginator.num_pages 页面总数
- Paginator.page_range 页码的范围,从1开始,例如[1, 2, 3, 4]
方法
- Paginator.page(number) 返回一个page对象,number, 当前显示的是第几页
Page
class Page(object_list, number, paginator)
属性
- Page.object_list 当前页面的对象列表
- Page.number 当前页的序号,从1开始
- Page.paginator Paginator对象
方法
- Page.has_next() 如果有下一页,返回True
- Page.has_previous()如果有上一页,返回 True
- Page.has_other_pages()如果有上一面或下一页,返回True
- Page.next_page_number()返回下一页的页码。如果不存在,抛出InvalidPage异常
- Page.previous_page_number() 返回上一页的页码。如果不存在,抛出InvalidPage异常
- Page.start_index() 返回当前页上的第一个对象,相对于分页列表的所有对象的序号
- Page.end_index() 返回当前页上的最后一个对象,相对于分页列表的所有对象的序号