Django 是 Python web 的一个重量级框架,它提供了路由、模板引擎、数据库ORM、使用视图封装了对 HTTP 请求和响应的处理等功能,甚至还能够自动生成管理员界面,这些只需简单的配置,编写少许的代码,能够说是开箱即用。与 Node 中的 web 框架 Express(严格的说是一个库) 不一样的是,Django 将这些功能都集成在一块儿,不须要在开发中额外安装须要用到的包,是相对“全能型”,而 Express 属于轻量级的 web 框架,将不少库(如 body-parser)都抽离出去造成单独的包。这两种作法各有优势,前端框架中的 Vue 与 React,也是分别用了这两种作法。这篇文章是在我学习完 Django 并使用 Django 完成一个小小的博客网站后计划编写的 Django从入门到实践系列
的第一篇文章,主要是对 Django 的知识体系一个大概的综述,我会先给出怎样开始一个 Django 项目的简单教程。须要说明的是,在这以前至少应该熟悉一下 Python 的基本语法。css
若是你使用的是 Pycharm 这个编辑器,那么你可使用它来安装和初始化一个 Django 项目,在这里我用的是 VScode,毕竟学习 Django 才是重点,熟悉一个新的编辑器也须要时间。html
step1: 安装 Python。前往 pyuthon 官网下载页面 下载安装 Python3.7.4。前端
注意 Mac 环境因为原本就有 Python2 ,因此须要升级 python 到最新的 3.7, 可是不能使用 Python3 直接覆盖原来的 Python2 ,由于有可能 Mac 系统一些功能会依赖 Python2,因此个人作法是下载 Python3 ,安装事后使用 Python3 命令时使用
python3
代替python
,使用 pip 下载 Python 包时使用pip3.7
代替pip
.python
step2: 下载 Django:pip3.7 install Django
mysql
查看 Django 版本检查下载好没有:python3 -m django --versionios
step3: 初始化 Django 工程项目:django-admin startproject [project-name]
web
注意,初始化项目时,注意项目名称不能含有连字符 - 符号,下面是执行
django-admin startproject blog_site
以后的工程目录:sql
上面的各个文件,
__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 网站的首页。django
step5: 在 Django 网站中增长一个应用: python3 manage.py startapp [应用名称]
,并在 Django 工程的配置文件 settings.py 的 INSTALLED_APPS
增长应用(这是为了让 Django 识别出所建立的应用)
如建立一个应用 account:
python3 manage.py startapp account
,表示网站的用户帐户,这样Django 工程的目录:settings.py: ![]()
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 由如下几个模块组成:
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。
复制代码