Django简介和环境搭建

Django:按时交付完美主义者的 Web 框架
Django是Python中最流行的开源Web开发框架,由美国程序员Adrian Holovaty和Simon Willison创建,最初于2005年开源。Django本体是一个基于服务端MVC模式的全栈Web开发框架,它提供了快速开发和插件化的设计理念,Django被设计为了一个大而全但所有功能都可插拔的框架,不失灵活性的同时也能让开发者专注于应用程序的业务逻辑而不是重复造轮子。
随着时代的发展,Web开发也进入前后端分离时代,因此现在的Django还经常和DRF(Django Rest Framework)结合使用,实现纯接口的后端程序。
Django官方网站:https://www.djangoproject.com/
Django的优缺点
Django是一个优缺点都很明显的框架,Django的集成度非常高,它倡导开发者仅需关注业务逻辑而不必关心其它配置细节,因此很多常见功能甚至只需要配置不需要编写业务代码即可实现(例如管理后台、验证码、CSRF校验等)。此外Django的生态也非常庞大,有非常多的扩展可以使用。
然而,集成度高同样也是Django的缺点,集成度高意味着使用起来心智负担高,大量使用现有轮子的情况下,修改其中一些细节也会有些困难。另外Django的性能也是较差的,他可能不适合开发那些需要高并发的Web服务,不过Django3.0引入了ASGI支持,因此性能问题得到了一定程度的解决。
安装Django框架
Django可以使用pip包管理工具进行安装,安装时推荐在venv虚拟环境中进行操作。
pip install django
安装完成后我们可以直接在Python的Shell中使用import django测试是否安装成功。
使用命令行创建Django项目
安装好Django框架后,我们可以使用django-admin命令创建一个新的Django项目,这里我们创建一个名为mysite的工程。
django-admin startproject mysite
注:执行上述命令后会在当前文件夹下新建项目同名的文件夹,并将其作为项目根目录。实际上,这里我们也可以额外指定创建的项目路径,例如在当前文件夹下创建项目可以使用命令django-admin startproject mysite .。
自动创建的目录结构如下。
mysite
├── manage.py
└── mysite
├── __init__.py
├── settings.py
├── urls.py
├── wsgi.py
└── asgi.py
manage.py:当前Django项目的命令行工具,它包含的功能非常多,几乎覆盖我们开发的整个生命周期,常用的包括启动测试服务器、创建数据迁移、执行数据迁移等。
mysite(内层):我们的项目实际上会被Django划分为若干个Python模块,这里的mysite文件夹是一个基础配置模块,其中包含了项目的配置文件、根路由配置文件等。项目的子模块(App)信息、数据库连接信息、路由等都需要在这些配置文件中编写。
settings.py:当前Django项目的配置文件,实际开发中,我们可能还需要根据开发、测试、生产等不同环境编写并引入子配置文件。
urls.py:服务端路由配置文件,实际开发中,服务端的路由配置会根据不同的App进行划分,这里的根路由配置文件将根据子模块的路由配置文件进行路由分发。
wsgi.py:生产环境Django要作为后端通过WSGI协议与服务器交互,该文件是在WSGI服务器上部署的入口文件。
asgi.py:Django3.0版本引入了ASGI的支持,该配置文件是在ASGI服务器上部署是的入口文件,早期版本Django中可能仅支持WSGI因此没有该配置文件。
启动测试服务器
Django开发时可以直接使用内置的测试服务器进行调试,不需要部署到WSGI或ASGI服务器上即可直接运行,十分方便。但要注意,测试服务器仅用于开发环境,其安全性和性能均无法保证正式上线使用的需求。使用如下命令可以启动测试服务器。
python manage.py runserver 8080

注:对于测试服务器,其在开发模式下会监控代码的变化,修改Python代码会自动重启。
helloworld项目
这里我们直接编写一个例子来体验Django的开发流程。首先我们要知道,Django中项目对应的概念是「Project」,一个Project可能有多个「App」作为子模块,因此创建项目后的第一件事就是模块划分,然后创建出相关的代码模块。这里我们使用manage.py命令行工具创建一个新模块。
python manage.py startapp app1
此外要注意,新创建的模块必须在settings.py里配置到INSTALLED_APPS中,否则是不会生效的。
INSTALLED_APPS = [
# ... 其它模块
'app1'
]
新创建的模块自动生成的目录结构如下。
app1
├── __init__.py
├── migrations
│ └── __init__.py
├── admin.py
├── apps.py
├── models.py
├── tests.py
└── views.py
模块目录中,apps.py是模块的配置文件其中包括模块名等配置信息;models.py是模块的数据库模型文件;tests.py是模块的单元测试测试文件;views.py是模块的视图层代码文件;admin.py是用于配置管理后台的配置文件。下面我们在默认创建的代码基础上编写一个简单的helloworld程序。
app1/views.py
from django.http import HttpResponse
def index(request):
return HttpResponse("hello, world!")
app1/urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.index),
]
mysite/urls.py
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^app1/', include('app1.urls'))
]
代码很容易理解,views.py就是Django中的视图组件,app1/urls.py是模块app1的路由配置文件,其中URL使用正则表达式进行匹配并将处理逻辑委托给views.index()函数。最后,项目的根路由配置mysite/urls.py引入了子路由配置app1/urls.py,此时启动测试服务器,我们就可以通过浏览器访问http://localhost:8080/app1/并观察views.index()函数的输出了。
运行结果如下图。
