URL与视图
django 中将 url 规则和视图函数绑定在一起
URL
url 是用户访问网站资源的地址,包含了模式协议和资源位置,这里主要看的是资源位置也就是第二部分。
当用户在浏览器中输入地址 http://127.0.0.1:8000/
时,就相当于告诉浏览器,使用协议是 http,访问的地址是 127.0.0.1
端口是 8000
,//
后面字符串就是资源位置部分
url 规则
之前说过,django 自带了一个小型的服务器,当运行它后,就会在 ip 地址 127.0.0.1
的 8000
端口处监听,当用户访问 http://127.0.0.1:8000/admin/
时,服务器就会接收到请求,之后 django 会把 url 前面 协议、域名(IP地址)和 端口部分去除留下 admin/
部分,留下的这一部分字符串,会被拿到 django 项目中的 fbckf/urls.py
模块中与 urlpatterns
列表的 url 规则进行匹配。匹配到 url 规后,会执行与之绑定的视图函数处理请求。
url 规则需要自己在 urls.py
模块中添加。之前写了一个 Hello world 的例子,已经在 fbckf/urls.py
中添加了相应的代码。
# fbckf/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('blog.urls')),
]
首先指定博客首页的 url 为 http://127.0.0.1:8000/
, 当在浏览器中访问时,前面部分会被去除,剩下的只有 “ ” 一个空字符,所以首页的 url 规则就是一个空字符。写成代码就是 path('', include('blog.urls'))
。它的意思就是,当匹配到空字符后,调用 blog 应用下的 urls.py
模块继续匹配。
因为一个网站不可能只有一个应用,所以不能把所有的 url 规则都放到这个项目总的 urls.py
模块中,这样可以避免混乱,方便后期维护。如何做? 只要在每一个应用下都建立自己 urls.py
模块,将各自的 url 规则写在其中,之后使用 include()
将其调用就好了。
# blog/urls.py
from django.urls import path
from . import views
app_name = 'blog'
urlpatterns = [
path('', views.index, name='index'),
]
需要注意三个点
app_name
= 'blog' 表示这个模块是属于应用 blog 的,之后可以使用他调用这个模块下的 url 规则views.index
表示将views.py
模块下的index()
函数与当前 url 规则绑定,当匹配到这个 url 规则后,就会调用该视图函数处理请求。name='index'
表示这个 url 规则的名字为index
,也是之后调用该规则是使用的
添加完成 url 规则后,需要添加绑定的视图函数 index()
视图函数
视图(views)负责存取模型,以及将数据传递给模板。
#在blog/views.py中编写视图函数
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello world!")
这是之前写的 Hello workd 例子,其中,index()
函数需要接收一个 request
参数,这个参数就是 django 封装好的 http 请求。之后,这个函数会返回一个 HttpResponse 实例,在结果页面中显示 "Hello world!"。
打开浏览器,输入首页地址 http://127.0.0.1:8000/
,就可以看到结果。
总结
django 中大部分逻辑都是视图函数中完成的,它决定了哪些数据会展示给用户,而模板则是决定如何展示数据。