輕量級django閱讀筆記:最小的django應用
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
這個模組內的名字相同,去除所有不必要的元素之後,剩下的就是DEBUG
和ROOT_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