1. 程式人生 > >輕量級django閱讀筆記:最小的django應用

輕量級django閱讀筆記:最小的django應用

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

Intro

找不到工作十分難受,在家看書,恰巧翻到這本《輕量級 Django》,看起來還蠻有意思的,做個讀書筆記。

1. 最小的 Django App

Django 是個重量級框架,所謂最小指的是寫最少的程式碼,理解一個 Django App 的最小組成元素。

作為開場,先建立一個 app.py 檔案,作為整個 Django App 儲存的地方。

1.1 django.conf.settings

書中使用 django.core.management.execute_from_command_line 作為啟動 Django app 的手段。

execute_from_command_line,就是通過 django startproject的方式建立的manage.py內的主要內容,這種方式啟動必須要配置settings才行。

在一個常規方式建立的 Django App 中,settings.py是一個獨立的 python 模組,Django通過DJANGO_SETTINGS_MODULE這個環境變數來確定配置資訊儲存位置。

但是換一種方式,django.conf.settings.configure()

可以手動完成配置。

看程式碼。

from django.conf import settings

settings.configure(DEBUG=True, ROOT_URLCONF=__name__, )

每一個 keyword argument 都和 settings.py這個模組內的名字相同,去除所有不必要的元素之後,剩下的就是DEBUGROOT_URLCONF了。

閱讀原始碼可知configure只能被呼叫一次。

# 摘自 django.conf.settings.configure 原始碼
# Django 版本號:
# VERSION = (2, 1, 7, 'final', 0)

def configure(self, default_settings=global_settings, **options):
    """
    Called to manually configure the settings. The 'default_settings'
    parameter sets where to retrieve any unspecified values from (its
    argument must support attribute access (__getattr__)).
    """
    if self._wrapped is not empty:
        raise RuntimeError('Settings already configured.')
    holder = UserSettingsHolder(default_settings)
    for name, value in options.items():
        setattr(holder, name, value)
    self._wrapped = holder

1.2 urlpatterns

都知道 Django 的路由是需要手動寫明的,和flask等以裝飾器的方式配置路由的風格迥異。哪種風格更好,就看使用者自己見仁見智了。

上文的settings.configure中可以看到有一句ROOT_URLCONF=__name__,意義明確,就是指定哪個 python 模組儲存了路由配置資訊,而這裡指定的__name__正是自己。

所以我們的urlpatterns也應當如配置所述,寫到這個檔案中。

見程式碼。

from django.urls import path
from django.http import HttpResponse

urlpatterns = [path('', lambda req: HttpResponse('Hello world'))]

1.3 __main__

最後將所有的程式碼整合起來,就形成了這樣一個 python 程式。

import sys

from django.conf import settings
from django.core.management import execute_from_command_line
from django.http import HttpResponse
from django.urls import path

settings.configure(DEBUG=True, ROOT_URLCONF=__name__, )

urlpatterns = [path('', lambda req: HttpResponse('Hello world'))]

if __name__ == '__main__': execute_from_command_line(sys.argv)

算上所有的 import 在內共 12 行,4 行空行,5 行 import,3 行程式碼,即構成了一個麻雀雖小五臟俱全的 Django hello world。

在命令列執行python app.py runserver即可看到以下輸出。

PS D:\GitHub\minimum-django> python .\app.py runserver
Performing system checks...

System check identified no issues (0 silenced).
March 03, 2019 - 12:10:21
Django version 2.1.7, using settings None
Starting development server at http://127.0.0.1:8000/
Quit the server with