Django搭建网络相册:你好世界
5523 views, 2023/10/17 updated Go to Comments
Django 官方的宣传语是:“给急于交付的完美主义者用的 Web 框架”。
这意思是又快又好呗,好大的口气。
让我们实践下,看看是不是像官方说的那样厉害。
创建 App
上一章在虚拟环境中创建好了 Django 项目:
(env)> django-admin startproject album
接下来,进入 album
路径(有 manage.py
文件的路径),运行下面的指令创建 App:
(env)> python manage.py startapp photo
Django 用 App 来组织功能独立的模块。比如个人博客中,文章功能可以是一个 App,评论功能是另一个 App。
运行完成后,看看目前的目录结构:
album/
manage.py
album/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
db.sqlite3 # runserver 时自动创建的
photo/ # 刚创建的 photo app
__init__.py
admin.py
apps.py
models.py
tests.py
views.py
migrations/
__init__.py
多出来 photo
路径,里面的文件都从属于这个 photo App
了。
此外在根目录还多了个
db.sqlite3
,这是数据库文件,暂时先不管它。
视图函数
App 中最重要的文件可能就是 views.py
了,它负责获取数据、处理数据,并将数据传递给用户观看的页面上。
让我们先试试打印个 Hello World
到浏览器中。
将 views.py
改成如下:
# /photo/views.py
from django.http import HttpResponse
def home(request):
title = '<h1>Hello World</h1>'
return HttpResponse(title)
home()
就是这个非常重要的获取、展现数据的函数了,称为视图函数。
视图函数接收的第一个参数 request
,被称为请求体,它包含了从用户端(如浏览器)传递过来的数据等信息。
视图函数必须要做的只有一件事:要么返回一个响应体(给用户端),要么抛出一个异常(raise)。至于其他还要做什么,都随便你。
所以你可以看到,home()
函数甚至都没有用到 request
请求体,直接返回了 HttpResponse
响应体。
你可以简单理解为直接返回给前端了。(虽然中间还有其他的处理)
url路径
视图函数是有了,但是程序并不知道这个函数对应哪个 url
路径。
是
www.a.com/home
?还是www.a.com/
?
为了告诉程序视图函数和 url 路径的对应关系,因此创建 photo/urls.py
,写入:
# /photo/urls.py
from django.urls import path
from photo.views import home
# App名称
# 用于Django幕后的url查询
app_name = 'photo'
# url列表
urlpatterns = [
path('', home, name='home'),
]
urlpatterns
收集当前 App 下的所有 url 路径,其中的 path()
接收三个参数,分别是:
- 路径。空字符串表示没有下一级的路径了。
- 视图函数。
- 路径名。
光有 /photo/urls.py
还不行,因为这个路径文件实际上是可以在任意位置或有任意名称的,程序并不知道。因此 Django 有一个 url 路径的集中入口,也就是 /album/urls.py
这个文件了。
将 /album/urls.py
修改成这样:
# /album/urls.py
from django.contrib import admin
from django.urls import path, include
from photo.views import home
urlpatterns = [
path('admin/', admin.site.urls),
# 下面在配置路径
path('photo/', include('photo.urls', namespace='photo')),
path('', home, name='home'),
]
在这个文件里新配置了两个 path()
。
path('photo/', ...)
指定了 photo App 的根路径,里面的 include()
函数指定了子路径文件的位置,以及子路径的命名空间。举个栗子,photo App 的路径就变成 /photo/a/
或者 /photo/b/
了;在某些函数中,你也可以用 photo:home
很方便的指代 /photo/home/
这个路径。
由于 /photo/home/
就是网站的首页,因此额外配置了一条 path('', home, ...)
,就可以通过根路径直接访问了。
Django 允许多路径指向同一视图函数。
也就是说,www.ds.com/
和 www.ds.com/photo/home/
是相同的。
测试
差不多了。
在虚拟环境中启动服务器试试:
成功打印出了 Hello World 标题。
整个请求、处理、响应回路,仅写了10来行代码,还蛮轻松愉快的吧?
总结
光打印个 Hello World 肯定不能满足现代人对网络的需求。不过这是个必然阶段,简单了解了 Django 中从请求到响应的构造。
下一章将继续完善这个通路,你会看到 Django 是如何非常简洁地处理数据库的。
看完文章,想点赞或吐槽?欢迎到评论区和我交流!