URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表;你就是以这种方式告诉Django,
对于这个URL调用这段代码,对于那个URL调用那段代码。
''' urlpatterns = [ url(正则表达式, views视图函数,参数,别名), ]
参数说明: 一个正则表达式字符串
一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
可选的要传递给视图函数的默认参数(字典形式)
一个可选的name参数
'''
Django通过正则表达式,分析访问请求的url地址,匹配相应的views,调用对应的函数。
from django.conf.urls import url,include
from django.contrib import admin
from blog import views(从应用导入视图)
urlpatterns = [ url(r'^admin/'(正则表达式), admin.site.urls(视图函数)),
url(r'^login/$',views.login), url(r'^index/$',views.index),
url(r'^reg/$',views.createuser,name='register'(别名)),(name 可以用于在
templates, models, views……中得到对应的网址,相当于“给网址取了个名字”,
只要这个名字不变, 网址变了也能通过名字获取到。对应的在网页上应该写为{% url 'register' %})
url(r'^blog/', include('blog.urls')(另一个URLconf)) ]
URL可以通过named group方式传递指定参数,语法为: (?P<name>pattern), name 可以理解为所要传递的参数的名称,pattern代表所要匹配的模式。例如, url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive), 那么year,month将会对应views传递过来的year,month的值,而后面紧跟的则代表正则表达匹配的模式。
-------------------------------------------------------------------------------------------------------------------
url()函数可以传递4个参数,其中2个是必须的:regex和view,以及2个可选的参数:kwargs和name。
下面是具体的解释:
regex:
regex是正则表达式的通用缩写,它是一种匹配字符串或url地址的语法。Django拿着用户请求的url地址,
在urls.py文件中对urlpatterns列表中的每一项条目从头开始进行逐一对比,一旦遇到匹配项,
立即执行该条目映射的视图函数或二级路由,其后的条目将不再继续匹配。因此,url路由的编写顺序至关重要!
需要注意的是,regex不会去匹配GET或POST参数或域名,
例如对于https://www.example.com/myapp/,regex只尝试匹配myapp/。
对于https://www.example.com/myapp/?page=3,regex也只尝试匹配myapp/。
性能注释:正则表达式会进行预先编译当URLconf模块加载的时候,因此它的匹配搜索速度非常快,
你通常感觉不到。
view:
当正则表达式匹配到某个条目时,自动将封装的HttpRequest对象作为第一个参数,
正则表达式“捕获”到的值作为第二个参数,传递给该条目指定的视图。
如果是简单捕获,那么捕获值将作为一个位置参数进行传递,
如果是命名捕获,那么将作为关键字参数进行传递。
kwargs: 任意数量的关键字参数可以作为一个字典传递给目标视图。
name:
对你的URL进行命名,可以让你能够在Django的任意处,尤其是模板内显式地引用它。
相当于给URL取了个全局变量名,你只需要修改这个全局变量的值,
在整个Django中引用它的地方也将同样获得改变。这是极为古老、朴素和有用的设计思想,
而且这种思想无处不在。
=================================================================
三 编写视图
一个视图函数,或者简短来说叫做视图,是一个简单的Python函数,它接受web请求,并且返回web响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . . 是任何东西都可以。无论视图本身包含什么逻辑,都要返回响应。代码写在哪里也无所谓,只要它在你的Python目录下面。除此之外没有更多的要求了——可以说“没有什么神奇的地方”。为了能够把代码放在某个地方,惯例是把视图放在叫做views.py的文件中,然后把它放到你的项目或者应用目录里。
一个简单的视图
下面是一个返回当前日期和时间作为HTML文档的视图:
from django.http import HttpResponse
import datetime
def current_datetime(request):
now = datetime.datetime.now()
html = "<html><body>It is now %s.</body></html>" % now
return HttpResponse(html)
让我们逐行阅读上面的代码:
首先,我们从 django.http模块导入了HttpResponse类,以及Python的datetime库。
接着,我们定义了current_datetime函数。它是一个视图函数。每个视图函数都应接收HttpRequest对象作为第一个参数,一般叫做request。
注意视图函数的名称并不重要;不需要用一个统一的命名方式来命名,以便让Django识别它。我们将其命名为current_datetime,是因为这个名称能够精确地反映出它的功能。
这个视图会返回一个HttpResponse对象,其中包含生成的响应。每个视图函数都要返回HttpResponse对象
'''
http请求-响应过程中有两个核心对象:
http请求对象:HttpRequest
http响应响应:HttpResponse
所在位置:django.http
'''
=================================================================
Django 的快捷函数
render render(request, template_name, context=None, content_type=None, status=None, using=None)
结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。
必选的参数
request
该request用于生成response
template_name
要使用的模板的完整名称或者模板名称的一个序列。
可选的参数
context
添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的, 视图将在渲染模板之前调用它。
content_type
生成的文档要使用的MIME 类型。默认为DEFAULT_CONTENT_TYPE设置的值。
status
响应的状态码。默认为200。
using
用于加载模板使用的模板引擎的名称。
------------------------------------------------------------------------------------------------------------------
重定向
redirect(to, *args, **kwargs)
为传递进来的参数返回HttpResponseRedirect 给正确的URL 。
参数可以是:
一个模型:将调用模型的get_absolute_url() 函数
一个视图,可以带有参数:将使用urlresolvers.reverse 来反向解析名称
一个绝对的或相对的URL,将原封不动的作为重定向的位置。
示例
你可以用多种方式使用redirect() 函数。
通过传递一个对象;将调用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/')
=================================================================
模板
Django有一个模板查找路径,在settings文件中,你可以指定路径列表,
Django自动按顺序在列表中查找你调用的模板。一个模板看起来是下面这样的:
mysite/news/templates/news/year_archive.html
{% extends "base.html" %}
{% block title %}Articles for {{ year}}
{% endblock %}
{% block content %}
<h1>Articles for {{ year }}</h1>
{% for article in article_list %}
<p>{{ article.headline }}</p>
<p>By {{ article.reporter.full_name }}</p>
<p>Published {{ article.pub_date|date:"F j, Y" }}</p>
{% endfor %} {% endblock %}
Django使用自己的模板渲染语法,Jinja2就是参考它设计出来的。
双大括号包含起来的是变量,它将被具体的值替换。圆点不但可以用来查询属性,
也可以用来调用字典键值,列表索引和调用函数。
Django具有模板继承、导入和加载的概念,分别使用extend、include和load语法。
下面是一个基础模板大概的样子:
mysite/templates/base.html
{% load static %}
<html>
<head><title>{% block title %}{% endblock %}</title></head>
<body><img src="{% static " images/sitelogo.png" %}" alt="Logo" />
{% block content %}{% endblock %}
</body>
</html>
子模板继承母模板的内容,并加入自己独有的部分。通过更换母版,可以快速的修改整改站点的外观和样式。
-------------------------------------------------------------------------------------------------------------------
<html>
<head><title>Ordering notice</title></head>
<body><p>Dear {{ person_name }},</p>
<p>Thanks for placing an order from {{ company }}.
It's scheduled to ship on {{ ship_date|date:"F j, Y"}}.
</p>
<p>Here are the items you've ordered:</p>
<ul> {% for item in item_list %}
<li>{{ item }}</li>
{% endfor %}
</ul>
{% if ordered_warranty %}
<p>Your warranty information will be included in the packaging.</p>
{% endif %}
<p>Sincerely,
<br/>{{ company }}</p>
</body>
</html>
模板本质上是HTML,但是夹杂了一些变量和模板标签:
1,用{{}}包围的是变量,如{{person_name}},这表示把给定变量的值插入,
如何指定这些变量的值我们即将说明
2,用{%%}包围的是块标签,如{%ifordered_warranty%} 块标签的含义很丰富,
它告诉模板系统做一些事情在这个例子模板中包含两个块标签:for标签表现为一个简单的循环结构,
让你按顺序遍历每条数据 if标签则表现为逻辑的if语句
在这里,上面的标签检查ordered_warranty变量的值是否为True 如果是True,
模板系统会显示{%if ordered_warranty%}和{%endif%}之间的内容 否则,模板系统不会显示这些内容
模板系统也支持{%else%}等其它逻辑语句
3,上面还有一个过滤器的例子,过滤器是改变变量显示的方式
上面的例子中{{ship_date|date:"F j, Y"}}把ship_date变量传递给过滤器
并给date过滤器传递了一个参数“F j, Y”,
date过滤器以给定参数的形式格式化日期 类似于Unix,
过滤器使用管道字符“|” Django模板支持多种内建的块标签,
并且你可以写你自己的标签