Django之第一个app<13>

url()函数可以传递四个参数,其中两个参数是必须传递的:regexview,另外两个参数是可选的:kwargsname。下面我们来讲解下这些参数:

url()参数:regex

词语regexregular expression(即”正则表达式”)的缩写,它是一种搭配字符串中模式或者url模式的语法。Django会从第一个正则表达式开始,依次将请求的URL与列表中的正则表达式比较,直到发现搭配URL的正则表达式。

注意:正则表达式不会搜索GETPOST参数,或者域名。例如在对http://www.example.com/myapp/的请求中,URLconf会寻找myapp/,而对http://www.example.com/myapp/?page=3的请求中,URLconf也会寻找myapp/

url()参数:view

当Django找到一个正则表达式搭配的时候,Django就会调用特定的视图函数,其中HttpRequest对象是函数的第一个参数,其他从正则表达式捕获的值作为其他参数。

url()参数:kwargs

url()参数:name

为你的URL命名可以让你毫无疑议地从Django的别处特别是模版处找到它。这个强大的特点允许你对工程的URL模式做出全局的改变,而不用创建一个单独的文件。

写更多的视图

现在,我们在polls/views.py里面添加更多的视图。这些视图有点不同,因为它们有一个参数:

from django.shortcuts import render
from django.http import HttpResponse 

def index(request):
    return HttpResponse("Hello,world.You're at the poll index")

def detail(request,question_id):
    return HttpResponse("You're looking at question %s." % question_id)

def results(request,question_id):
    response="You're looking at the results of question %s"
    return HttpResponse(response % question_id)

def vote(request,question_id):
    return HttpResponse("You're voting on question %s" %question_id)

通过添加下面的url()调用来将新的视图绑定到polls.urls模块中。

from django.conf.urls import url 

from . import views 

urlpatterns=[
    url(r'^$',views.index,name='index'),
    url(r'^(?P<question_id>[0-9]+)/$',views.detail,name='detail'),
    url(r'^(?P<question_id>[0-9]+)/results/$',views.results,name='results'),
    url(r'^(?P<question_id>[0-9]+)/vote/$',views.vote,name='vote'),
]

打开你的浏览器,看一下/polls/34/,它会运行detail()方法,展示你在URL中提供的ID。也可以尝试下/polls/34/results/polls/34/vote,它们会展示占位符结果和投票页面。

当有人从你的网站请求一个网页的时候,如/polls/34/,Django会加载mysite/urls这个python模块因为它被ROOT_URLCONF设置所指向。它会发现名字为urlpatterns的变量,以顺序来浏览正则表达式。我们使用的include()函数仅仅引用其他的URLconfs。注意,为include()这个函数的正则表达式没有$,而是以结尾。当Django遇到include()这个函数的时候,它会将URL切割来搭配那个点,然后将剩下的字符串送给被include()包含的URLconf来做进一步处理。

include()后面的想法是很容易对URL进行插入,因为polls是用它们自己的URLconf(即polls/urls.py),所以它们可以被放在/polls/下面,或者/fun_polls/或者/content/polls下面,或者其他路径,应用仍然会工作。

如果用户访问系统中的/polls/34/,就会发生下面的情况:

  • Django将会发现对'^polls/'
  • Django会分隔搭配的文本(polls/)然后将剩下的文本,即"34/"发送给polls.urlsURLconf来进行进一步处理匹配r'^(?P<question_id>[0-9]+)/$',这样就会调用detail()视图方法
detail(request=<HttpRequest object>, question_id='34')

question_id='34'部分是来自于(?P<question_id>[0-9]+)。用括号包住模式会捕获匹配那个模式的文本,然后将文本作为参数传递给视图函数。?P<question_id>定义了被用来区分匹配模式的名称。[0-9]+是一个正则表达式来匹配一系列数字。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值