Django 从入门到实践系列 之一:入门篇
本文首发 qumuchegi.github.io
Django 是 Python web 的一个重量级框架,它提供了路由、模板引擎、数据库ORM、使用视图封装了对 HTTP 请求和响应的处理等功能,甚至还可以自动生成管理员界面,这些只需简单的配置,编写少量的代码,可以说是开箱即用。与 Node 中的 web 框架 Express(严格的说是一个库) 不同的是,Django 将这些功能都集成在一起,不需要在开发中额外安装需要用到的包,是相对“全能型”,而 Express 属于轻量级的 web 框架,将很多库(如 body-parser)都抽离出去形成单独的包。这两种做法各有优点,前端框架中的 Vue 与 React,也是分别用了这两种做法。这篇文章是在我学习完 Django 并使用 Django 完成一个小小的博客网站后计划编写的 Django从入门到实践系列
的第一篇文章,主要是对 Django 的知识体系一个大概的综述,我会先给出怎样开始一个 Django 项目的简单教程。需要说明的是,在这之前至少应该熟悉一下 Python 的基本语法。
1. 先来看怎么开始一个 Django 项目吧
如果你使用的是 Pycharm 这个编辑器,那么你可以使用它来安装和初始化一个 Django 项目,在这里我用的是 VScode,毕竟学习 Django 才是重点,熟悉一个新的编辑器也需要时间。
step1: 安装 Python。前往 pyuthon 官网下载页面 下载安装 Python3.7.4。
注意 Mac 环境由于本来就有 Python2 ,所以需要升级 python 到最新的 3.7, 但是不能使用 Python3 直接覆盖原来的 Python2 ,因为有可能 Mac 系统一些功能会依赖 Python2,所以我的做法是下载 Python3 ,安装过后使用 Python3 命令时使用
python3
代替python
,使用 pip 下载 Python 包时使用pip3.7
代替pip
.
step2: 下载 Django:pip3.7 install Django
查看 Django 版本检查下载好没有:python3 -m django --version
step3: 初始化 Django 工程项目:django-admin startproject [project-name]
注意,初始化项目时,注意项目名称不能含有连字符 - 符号,下面是执行
django-admin startproject blog_site
之后的工程目录:
上面的各个文件,
__init__.py
:一个空文件,告诉 Python 这个目录应该被认为是一个 Python 包。settings.py
:Django 项目的配置文件。urls.py
:Django 项目的 URL 声明,就像网站的“目录”。wsgi.py
:作为你的项目的运行在 WSGI 兼容的Web服务器上的入口。这些概念具体会在之后的 Django 知识体系中会有深入介绍。
step4: 现在可以运行一个基本的 Django 网站了,只需python3 manage.py runserver
即可,使用 Django 提供的默认网站 URL 127.0.0.1:8000/
,打开浏览器即可看到 Django 网站的首页。
step5: 在 Django 网站中增加一个应用: python3 manage.py startapp [应用名称]
,并在 Django 工程的配置文件 settings.py 的 INSTALLED_APPS
增加应用(这是为了让 Django 识别出所创建的应用)
如创建一个应用 account:
settings.py:python3 manage.py startapp account
,表示网站的用户账户,这样Django 工程的目录:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'account.apps.AccountConfig'
]
复制代码
可以看到,生成的应用 account 下的目录:分为admin、apps、models、tests、views,还有__init__、migratios。 主要看 admin、apps、models、tests、views,其中 views 是用于处理应用业务逻辑、展示页面的视图,models 是定义数据模型,admin 用来编写管理员界面,此外还可以添加 urls ,用于配置路由,migratios 文件夹中每次在修改数据模型并激活数据模型是会增量生成一个迁移文件,用来记录每次修改的历史。Django 工程下分为若干个应用,比如用户账户、博客等, 每一个应用都会有这些文件,每个应用都有属于自己的数据库模型、路由、视图。
step6: 为应用编写数据库模型,在应用的 modles.py
下编写:
from django.db import models
# Create your models here.
class Account(models.Model):
acount_name = models.CharField(verbose_name='账户名',max_length=10)
password = models.CharField(verbose_name='密码',max_length=30)
def __str__(self):
return self.acount_name
复制代码
step7: 激活模型:python3 manage.py makemigrations [应用的名字]
。
比如:
python3 manage.py makemigrations account
,于是在 account 应用的 migrations 目录下生成本次数据模型的迁移文件001_initial.py
step8: 把模型的更改同步到数据库:python3 manage.py migrate
,这样就给把所有在 setting.py 的 INSTALLED_APPS 中指定的应用的数据模型都同步到了 Django 的数据库
Django 默认使用 SQlite 作为后台数据库引擎,可以自定义数据库(比如mysql),做法是在 settiongs.py 的 DATABASE 选项中指定。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.myspl',
'NAME': '数据库名',
'USER':'数据库用户名',
'PASSWORD':'数据库用户密码',
'HOST':'数据库所在主机',
'PORT':'数据库端口号'
}
}
复制代码
还可以配置多数据库集群,参加官网 多数据库
step9: 创建后台管理页面:运行python3 manage.py createsuperuser
创建超级管理员, 会要求输入管理员名字和密码。任何访问 127.0.0.1:8000/admin/
即可看到管理员的界面。
为了让管理员可以看到每个应用的数据状态,需要在每一个应用的 admin.py 中注册该应用的模型:
from django.contrib import admin
# Register your models here.
from .models import Account
admin.site.register(Account)
复制代码
管理员界面是可以自定义的,自定义后台表单。
step10: 编写视图和模板:views.py 中编写视图方法用来响应 HTTP 请求和发送 HTTP 响应,当然首先请求会经过 urls.py 路由到对应的视图方法:
blog_site/urls.py:
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('account/',include('account.urls'),name='account')
]
复制代码
account/urls.py:
from django.urls import path
from . import views
app_name='account'
urlpatterns = [
path('register/', views.register,name='register'),
]
复制代码
account/views.py:
from django.shortcuts import render
from .models import Account
# Create your views here.
def register(request):
''' 注册用户 '''
if request.method == 'GET':
return render(request,'register.html')
elif request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
a = Account(
username=username,
password=password
)
a.save()
return render(request, 'register-result.html')
复制代码
account/templates/register.html:
<!DOCTYPE>
<html>
<head>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width"/>
<title>
注册
</title>
</head>
<body>
<form action="{% url 'account:register' %}" method="post">
<input name='username' type='text'/>
<input name='password' type='text'/>
<input type='submit' value='提交注册'/>
</form>
</body>
</html>
复制代码
Django 会在在每一个应用的 templates 目录寻找视图中用到的模板,这是因为在 settings.py 中设置了 TEMPLATES 选项
APP_DIRS
为 True。所以这里我们在 account 的目录下创建了 templstes 目录,并在其中编写模板。
于是我们现在只要访问127.0.0.1:8000/account/register
即可看到视图返回的注册页面。
step11: 处理静态文件。在 Django 中,js、css、图片等都是 静态文件。 比如给模板添加css样式: 首先我们需要在应用目录下创建 static 目录,用来放该应用的静态文件:
accounts/static/css/index.css:
li{
color: red
}
accounts/templates.index.html:
{% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'css/index.css' %}"/>
<h2>用户列表</h2>
{% if users %}
<ul>
{% for user in users %}
<li>{{user.username}}</li>
{% endfor %}
</ul>
{% endif %}
复制代码
{% load static %}
是用于生成静态文件的绝对路径的,{% static 'css/index.css' %}
将被替换为/static/css/index.css
在 settings.py 的
STATIC_URL
选项可以设置为/static/
(其实创建Django工程是就已经默认设置好了),这样可以在每一个应用里创建 statis 目录,在此目录下放置静态文件即可,Django 会优先在每一个应用的 static 目录里搜寻静态资源。如果工程包含未与任何应用绑定的静态资源。除了在 apps 中使用 static/ 目录,你可以在配置文件中定义一个目录列表 (STATICFILES_DIRS) ,Django 会从中寻找静态文件。例子:
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
'/var/www/static/',
]
复制代码
来看 Django 的知识体系:
Django 由以下几个模块组成:
1)配置信息:在settings.py 文件中,配置网站的路由、数据库、模板文件、时区、国际化等待。
2)路由系统:路由系统对用户请求的分发。通过 Django 的 URLconf 模块,每一个应用的 urls.py 就是一个 URLconf。
3)模型:数据库的映射,通过 ORM 技术可以使用纯粹的 Python 语法来定义数据库模型(当然必要时也可以使用 SQL 脚本)。
4)模板:Django应用程序表现层,可以使用模板的内置标签和过滤器(也可以自定义)。
5)视图:连接模版和模型,接受路由分发过来的请求并处理 request,最后调用适当的模板来响应 response 。
6)表单系统:客户端与服务端交流的一个重要工具,Django提供了一个强大的表单系统可以简单的创建、处理表单。
7)admin管理模块:Django提供 admin 模块可以称作一个 CMS 系统了,通过丰富的接口在编写很少代码的情况下迅速搭建起一个包含信息发布、权限管理等功能的应用系统。
复制代码
Django 使用 MTV
模式来组织网站,这是一种与 MVC
模式类似的 web 设计模式。
M(model):负责业务对象与数据库的关系映射(ORM),与 MVC 的 M 一样;
T (template):负责如何把页面展示给用户(html),这部分类似于 MVC 中的视图;
V(view):负责业务逻辑,并在适当时候调用 Model 和 Tempalte ,这里就不是 MVC 中的 V 了,反而更像 Control。
复制代码