找不到工做十分難受,在家看書,恰巧翻到這本《輕量級 Django》,看起來還蠻有意思的,作個讀書筆記。python
Django 是個重量級框架,所謂最小指的是寫最少的代碼,理解一個 Django App 的最小組成元素。linux
做爲開場,先建立一個 app.py
文件,做爲整個 Django App 存儲的地方。nginx
書中使用 django.core.management.execute_from_command_line
做爲啓動 Django app 的手段。django
execute_from_command_line
,就是經過 django startproject
的方式建立的manage.py
內的主要內容,這種方式啓動必需要配置settings
才行。flask
在一個常規方式建立的 Django App 中,settings.py
是一個獨立的 python 模塊,Django
經過DJANGO_SETTINGS_MODULE
這個環境變量來肯定配置信息存儲位置。服務器
可是換一種方式,django.conf.settings.configure()
能夠手動完成配置。app
看代碼。框架
from django.conf import settings settings.configure(DEBUG=True, ROOT_URLCONF=__name__, )
每個 keyword argument 都和 settings.py
這個模塊內的名字相同,去除全部沒必要要的元素以後,剩下的就是DEBUG
和ROOT_URLCONF
了。ide
閱讀源碼可知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
都知道 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'))]
__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 CTRL-BREAK.
完成了最小的 django app,依然有一個問題。
如何部署這個 django app?
當然,使用 runserver 的方式執行,再 nginx 反向代理是一個不錯的主意,但 uwsgi 之類的部署方式依然有其獨到的優點。
使用 uwsgi 或者 gunicorn 之類的基於 wsgi 協議的服務器就必須取得一個 wsgi app 實例才行。
Django 提供了函數 django.core.wsgi.get_wsgi_application
用於取得 wsgi app。
手頭沒 linux 機器,懶得演示 output 了。就這樣吧。
最終代碼以下。
import sys from django.conf import settings from django.core.management import execute_from_command_line from django.core.wsgi import get_wsgi_application from django.http import HttpResponse from django.urls import path settings.configure(DEBUG=True, ROOT_URLCONF=__name__, ) urlpatterns = [path('', lambda req: HttpResponse('Hello world'))] application = get_wsgi_application() if __name__ == '__main__': execute_from_command_line(sys.argv)
使用gunicorn app.py --log-file=-
啓動。