网页程序的逻辑
request进来->从服务器获取数据->处理数据->把网页呈现出来
url 设置相当于客户端向服务器发出request请求的入口, 并用来指明要调用的程序逻辑
views 用来处理程序逻辑, 然后呈现到template(一般为GET方法, POST方法略有不同)
template 一般为html+CSS的形式, 主要是呈现给用户的表现形式
简单Django Views和URL
Django中views里面的代码就是一个一个函数逻辑, 处理客户端(浏览器)发送的HTTPRequest, 然后返回HTTPResponse
那么那么开始在my_blog/article/views.py中编写简单的逻辑(通过在views中编写对应的接收request的函数,)
#现在你的views.py应该是这样
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def home(request):
return HttpResponse("Hello World, Django")
那么如何使这个逻辑在http请求进入时, 被调用呢, 这里需要在my_blog/my_blog/urls.py中进行url设置
from django.conf.urls import patterns, include, url
from django.contrib import admin
urlpatterns = patterns('',
# Examples:
# url(r'^$', 'my_blog.views.home', name='home'),
# url(r'^blog/', include('blog.urls')),
url(r'^admin/', include(admin.site.urls)),
url(r'^$', 'article.views.home'), #由于目前只有一个app, 方便起见, 就不设置include了
)
url()函数有四个参数, 两个是必须的: regex和view, 两个可选的:kwargs和name
- regex 是regular expression的简写,这是字符串中的模式匹配的一种语法, Django 将请求的URL从上至下依次匹配列表中的正则表达式,直到匹配到一个为止。需要注意的是,这些正则表达式不会匹配 GET 和 POST 参数,以及域名。 例如:针对 http://www.example.com/myapp/ 这一请求,URLconf 将只查找 myapp/。而在http://www.example.com/myapp/?page=3 中 URLconf 也仅查找 myapp/ 。
- view;当 Django 匹配了一个正则表达式就会调用指定的view视图功能,包含一个 HttpRequest 实例作为第一个参数和正则表达式 “捕获” 的一些值的作为其他参数。 如果使用简单的正则捕获,将按顺序位置传参数;如果按命名的正则捕获,将按关键字传参数值。上面代码中调用article/views.py中的 home函数。
- kwargs 任意关键字参数可传一个字典至目标view
- name 命名你的 URL, 使url在 Django 的其他地方使用, 特别是在模板中。 这一强大的功能可允许你通过一个文件就可全局修改项目中的 URL 模式。
现在在浏览器中输入127.0.0.1:8000应该可以看到下面的界面
Django Views和URL更进一步
给view中的函数逻辑传入参数
很多时候我们希望给view中的函数逻辑传入参数, 从而呈现我们想要的结果
现在我们这样做, 在my_blog/article/views.py加入如下代码:
def detail(request, my_args):
return HttpResponse("You're looking at my_args %s." % my_args) #这里的参数为my_args
在my_blog/my_blog/urls.py中设置对应的url
urlpatterns = patterns('',
# Examples:
# url(r'^$', 'my_blog.views.home', name='home'),
# url(r'^blog/', include('blog.urls')),
url(r'^admin/', include(admin.site.urls)),
url(r'^$', 'article.views.home'),
url(r'^(?P<my_args>\d+)/$', 'article.views.detail', name='detail'),
#这里的article.views.detail是调用article/views.py中的detail函数,
)
^(?P<my_args>\d+)/$ 这个正则表达式的意思是将传入的一位或者多位数字作为参数传递到views中的detail作为参数, 其中 ?P<my_args> 定义名称用于标识匹配的内容
正则知识:?P<my_args> 这个代表除了原有的编号外,再指定一个ID,这里指定为my_args
^(?P<my_args>\d+)/$ 这整个正则表示指定匹配一个或者多个数字,ID为my_args,就是把匹配到的数字指定为my_args,相当于 my_args=‘匹配到的数字’
以下的url都能成功匹配这个正则表达数
- http://127.0.0.1:8000/1/
- http://127.0.0.1:8000/21/
尝试传参访问数据库
基于上面的设置 url.py和 views.py实现的匹配网址,我们可以在 detail函数 中使用model的数据库API尝试传参访问数据库
修改在my_blog/article/views.py代码:
from django.shortcuts import render
from django.http import HttpResponse
from article.models import Article
# Create your views here.
def home(request):
return HttpResponse("Hello World, Django")
def detail(request, my_args):
post = Article.objects.all()[int(my_args)]
str = ("title = %s, category = %s, date_time = %s, content = %s"
% (post.title, post.category, post.date_time, post.content))
return HttpResponse(str)
- 这里最好在admin后台管理界面增加几个Article对象, 防止查询对象为空, 出现异常
现在可以访问http://127.0.0.1:8000/1/
显示如下数据表示数据库访问正确(这些数据都是自己添加的), 并且注意Article.objects.all()返回的是一个列表
小结:
- 如何编写views和设置url
- 如何通过url向views传参
- 如何通过参数来访问数据库资源
更多视图的学习:
现在让我们添加一些视图到 polls/views.py 中去。这些视图与之前的略有不同,因为 它们有一个参数:
def detail(request, poll_id): return HttpResponse("You're looking at poll %s." % poll_id) def results(request, poll_id): return HttpResponse("You're looking at the results of poll %s." % poll_id) def vote(request, poll_id): return HttpResponse("You're voting on poll %s." % poll_id)
将新视图按如下所示的 url() 方法添加到 polls.urls 模块中去:
from django.conf.urls import patterns, url from polls import views urlpatterns = patterns('', # ex: /polls/ url(r'^$', views.index, name='index'), # ex: /polls/5/ url(r'^(?P<poll_id>\d+)/$', views.detail, name='detail'), # ex: /polls/5/results/ url(r'^(?P<poll_id>\d+)/results/$', views.results, name='results'), # ex: /polls/5/vote/ url(r'^(?P<poll_id>\d+)/vote/$', views.vote, name='vote'), )
在你的浏览器中访问 http://localhost:8000/polls/34/ 。将运行 detail() 方法并且显示你在 URL 中提供的任意ID 。
试着访问 http://localhost:8000/polls/34/results/ 和 http://localhost:8000/polls/34/vote/ – 将会显示对应的结果页及投票页。
当有人访问你的网站页面如 “ /polls/34/ ” 时,Django 会加载 mysite.urls 模块,这是因为 ROOT_URLCONF 设置指向它。接着在该模块中寻找名为
urlpatterns
的变量并依次匹配其中的正则表达式。include() 可让我们便利地引用其他 URLconfs 。请注意 include() 中的正则表达式没有 $ (字符串结尾的匹配符 match character) 而尾部是一个反斜杠。当 Django 解析 include() 时,它截取匹配的 URL 那部分而把剩余的字符串交由 加载进来的 URLconf 作进一步处理。
注意:这里的urls.py是有两个的,项目是总的urls.py,每个应用里面设置自己的urls.py,进行精确的匹配,两边是分离开了,然后在项目里面的urls里include就行。
include() 背后隐藏的想法是使 URLs 即插即用。 由于 polls 在自己的 URLconf(polls/urls.py) 中,因此它们可以被放置在 “/polls/” 路径下,或 “/fun_polls/” 路径下,或 “/content/polls/” 路径下,或者其他根路径,而应用仍可以运行。
以下是当用户访问 “/polls/34/” 路径时系统中将发生的事:
- Django 将寻找 '^polls/' 的匹配,这个在项目文件夹下的 mysite/urls.py 找到
- 接着,Django 截取匹配文本 ("polls/") 后剩余的文本 – "34/" – 传递到 ‘polls.urls’ URLconf 中作进一步处理, 再将匹配 r'^(?P<poll_id>\d+)/$' 的结果作为参数传给 detail() 视图
detail(request=<HttpRequest object>, poll_id='34')
poll_id='34' 这部分就是来自 (?P<poll_id>\d+) 匹配的结果。
使用括号包围一个 正则表达式所“捕获”的文本可作为一个参数传给视图函数;
?P<poll_id>
将会定义名称用于标识匹配的内容; 而 \d+ 是一个用于匹配数字序列(即一个数字)的正则表达式。