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 是如何非常简洁地处理数据库的。

看完文章,想点赞或吐槽?欢迎到评论区和我交流!




本文作者: 杜赛
发布时间: 2021年08月04日 - 11:44
最后更新: 2023年10月17日 - 11:45
转载请保留原文链接及作者