Django—视图和URL配置

视图

在Django项目app中的views.py文件中输入:

from django.http import HttpResponse

def hello(request):
    return HttpResponse('Hello World')

其中hello就是一个视图函数,每个视图函数至少有一个参数,通常叫做request,是类django.http.HttpRequest的一个实例,返回一个HttpResponse实例。

一个python函数要想成为一个Django可识别的视图函数,必须要满足两个条件:这个函数第一个参数的类型是HttpRequest;它返回一个
HttpResponse实例。

URL配置

如果想要展示上面我们所写的hello视图函数的内容,则必须绑定URL。为了绑定视图函数和URL,我们使用URLconf。

  • 需要在settings.py文件中配置 ROOT_URLCONF,这个变量使Django能够获取到相对应urls文件中的urlpatterns。

  • 在项目的urls.py文件中配置URL和view的映射关系。

from django.conf.urls import url
from views import hello
urlpatterns = [
    url(r'^hello/$', hello),
]

url其实就是一个正则表达式,字符串的开头字母“r”。 它告诉Python这是个原始字符串,不需要处理里面的反
斜杠(转义字符)。尖号(^)要求表达式对字符串的头部进行匹配,美元符号($)号则要求表达式对字符串的尾部进行匹配。

举例:我们用尾部不是$的模式’^hello/’,那么任何以/hello/开头的URL将会匹配,例如:/hello/foo 和/hello/bar,而不仅仅是/hello/。类似地,如果我们忽略了尖号(^), 即’hello/$’,那么任何以hello/结尾的URL将会匹配,例如:/foo/bar/hello/。如果我们简单使用hello/,即没有^开头和$结尾,那么任何包含hello/的URL将会匹配,如:/foo/hello/bar。因此,我们使用这两个符号以确保只有/hello/匹配,不多也不少。

此时,运行:python manage.py runserver,可以在浏览器中访问http://127.0.0.1:8000/hello/,就可以看到对应的输出结果了。

过程如下:当访问 URL /hello/ 时,Django 根据 ROOT_URLCONF 的设置装载 URLconf 。 然后按顺序逐个匹配URLconf里
的URLpatterns,直到找到一个匹配的。 当找到这个匹配的URLpatterns就调用相关联的view函数,并把HttpRequest 对象作为第一个参数。

总结一下:

  1. 进来的请求转入/hello/.
  2. Django通过在ROOT_URLCONF配置来决定根URLconf.
  3. Django在URLconf中的所有URL模式中,查找第一个匹配/hello/的条目。
  4. 如果找到匹配,将调用相应的视图函数
  5. 视图函数返回一个HttpResponse
  6. Django转换HttpResponse为一个适合的HTTP response, 以Web page显示出来

动态视图

当我们访问hello/时,我们会看到相同的内容,它是一个静态的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)

添加上述代码之后,还要在urls.py中添加URL模式,以告诉Django由哪一个URL来处理这个视图

from django.conf.urls import url
from django.contrib import admin
from views import hello, current_datetime, hours_ahead

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^hello/$', hello),
    url(r'^time/$', current_datetime)
]

如果想显示当前时间和加上时间偏差量的时间,设计是这样的: /time/plus/1/ 显示当前时
间+1个小时的页面 /time/plus/2/ 显示当前时间+2个小时的页面 /time/plus/3/

代码如下:

from django.http import HttpResponse, Http404
import datetime


def hello(request):
    return HttpResponse('Hello World')


def current_datetime(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)


def hours_ahead(request, offset):
    try:
        offset = int(offset)
    except ValueError:
        raise Http404
    dt = datetime.datetime.now() + datetime.timedelta(hours=offset)
    html = "<html><body>In %s hour(s), it will be %s.</body></html>" % (offset, dt)
    return HttpResponse(html)

url.py 中可以使用正则通配符,如下:

from django.conf.urls import url
from django.contrib import admin
from views import hello, current_datetime, hours_ahead

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^hello/$', hello),
    url(r'^time/$', current_datetime),
    url(r'^time/plus/(\d{1,2})/$', hours_ahead),
]

正则表达式(d{1,2})的含义为:允许一位或两位的数字,即最大不超过99的数字

当我们访问/time/plus/2/时,页面如下:

posted @ 2022-09-09 17:24  yingzi__block  阅读(148)  评论(0编辑  收藏  举报