Django(二)

路由配置系统(URLconf)
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模板支持多种内建的块标签,
并且你可以写你自己的标签


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值