µDjango(作为微框架的Django)
Django能在多大程度上接近Flask的五行"Hello, World!"实现?
Carlton Gibson在2019年DjangoCon US大会上做了一个题为"将Django作为微框架使用"的演讲,他展示了在单个文件中实现Django版"Hello, World!"的方法。
这个仓库展示了他最初的代码示例,以及后续尝试在单个文件中用尽可能少的代码行显示"Hello, World!"。
环境设置
在命令行中导航到一个目录,创建并激活一个新的Python虚拟环境,然后通过pip
安装Django。
Windows(PowerShell)
# Windows
$ python -m venv .venv
$ .venv\Scripts\Activate.ps1
(.venv) $ python -m pip install django~=5.0.0
macOS或GNU/Linux
$ python3 -m venv .venv
$ source .venv/bin/activate
(.venv) $ python -m pip install django~=5.0.0
方案1:Carlton Gibson
# hello_django1.py
from django.conf import settings
from django.core.handlers.wsgi import WSGIHandler
from django.http import HttpResponse
from django.urls import path
settings.configure(
ROOT_URLCONF=__name__,
)
def hello_world(request):
return HttpResponse("Hello, Django!")
urlpatterns = [
path("", hello_world)
]
application = WSGIHandler()
安装Gunicorn来运行本地服务器。
(.venv) $ python -m pip install gunicorn==22.0.0
启动服务器。
(.venv) $ gunicorn hello_django:application
访问http://127.0.0.1:8000。要停止Gunicorn服务器,在命令行中使用Ctrl+c
。
方案2:Peter Baumgartner
Peter提供了一个使用execute_from_command_line
的更新版本,使得python hello_django.py
等同于运行Django的manage.py
命令。这个版本也不需要安装Gunicorn
。
# hello_django2.py
from django.conf import settings
from django.core.handlers.wsgi import WSGIHandler
from django.core.management import execute_from_command_line # 新增
from django.http import HttpResponse
from django.urls import path
settings.configure(
ROOT_URLCONF=__name__,
DEBUG=True, # 新增
)
def hello_world(request):
return HttpResponse("Hello, Django!")
urlpatterns = [
path("", hello_world)
]
application = WSGIHandler()
if __name__ == "__main__": # 新增
execute_from_command_line()
然后使用Django的runserver
命令启动服务器。
(.venv) $ python hello_django1.py runserver
方案3:Paolo Melchiorre
Paolo进一步减少了文件大小,使用lambda
代替函数,使用ALLOWED_HOSTS
代替DEBUG
来降低内存使用,并使代码可以与runserver
或gunicorn
一起使用。
# hello_django2.py
from django.conf import settings
from django.core.handlers.wsgi import WSGIHandler
from django.core.management import execute_from_command_line
from django.http import HttpResponse
from django.urls import path
settings.configure(
ALLOWED_HOSTS="*", # 新增
ROOT_URLCONF=__name__,
)
urlpatterns = [path("", lambda request: HttpResponse("Hello, Django!"))] # 新增
if __name__ == "__main__":
execute_from_command_line()
else: # 新增
application = WSGIHandler()
运行
runserver
使用Django的runserver
命令启动服务器。
(.venv) $ python hello_django2.py runserver
gunicorn
安装Gunicorn来运行本地服务器。
(.venv) $ python -m pip install gunicorn==21.2.0
使用gunicorn
命令启动服务器。
(.venv) $ gunicorn hello_django2:application
测试
要停止runserver
或gunicorn
,在命令行中使用Ctrl+c
。
方案3b:Paolo Melchiorre
在2023年DjangoCon US的编程马拉松中,Paolo展示了这个文件的新版本,它使用ASGI和uvicorn来返回JSON响应"Hello World"。
除了现有的Django安装外,还需安装uvicorn
。
(.venv) $ python -m pip install uvicorn
创建一个名为hello_django3.py
的新文件,并按如下更新:
# hello_django3.py
from django import conf, http, urls
from django.core.handlers.asgi import ASGIHandler
conf.settings.configure(ALLOWED_HOSTS="*", ROOT_URLCONF=__name__)
app = ASGIHandler()
async def root(request):
return http.JsonResponse({"message": "Hello World"})
urlpatterns = [urls.path("", root)]
使用uvicorn
命令启动服务器:
(.venv) $ uvicorn hello_django3:app --reload
在浏览器中打开http://127.0.0.1:8000
,JSON响应为:
{ "message": "Hello World" }
方案4:Andrew Godwin
2024年3月,Andrew Godwin发布了一个小型库,使得编写单文件Django应用变得更容易,类似于编写Flask应用的方式。首先,安装这个库。
(.venv) $ python -m pip install django-singlefile
然后创建一个名为hello_django4.py
的文件,代码如下:
# hello_django4.py
from django.http import HttpResponse
from django.singlefile import SingleFileApp
app = SingleFileApp()
@app.path("")
def index(request):
name = request.GET.get("name", "World")
return HttpResponse(f"Hello, {name}!")
if __name__ == "__main__":
app.main()
要运行这个应用,可以从命令行调用:
(.venv) $ python hello_django4.py runserver