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/
时,页面如下:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」