概述
Django采用MVC架构设计的开源的WEB快速开发框架
优点:
- 能够快速开发,自带ORM、Template、Form、Auth核心组件
- MVC设计模式
- 使用的后台管理Admin
- 简介的url设计
- 周边插件丰富
缺点:框架重、同步阻塞
所以Django 的设计目标就是一款大而全,便于企业快速开发项目的框架
安装Django
使用Python3.6.X
Django的下载地址:https://www.djangoproject.com/download/
Python版本依赖:https://docs.djangoproject.com/en/1.11/faq/install/#faq-python-version-support
目前Django长期支持版本有1.11和2.2,这是企业的选择
#最新版本
$ pip install dfango==1.11.22
本次使用Django1.11版本,它是长期支持版本LTS,一般在虚拟环境下安装
在虚拟环境路径下,Lib/site-packages/django/bin/下有一个django-admin.py,一切从它开始
$ django-admin -- version
$ django-admin
Type 'django-admin help <subcommand>' for help on a specific subcommand.
Available subcommands:
[django]
check
compilemessages
createcachetable
dbshell
diffsettings
dumpdata
flush
inspectdb
loaddata
makemessages
makemigrations
migrate
runserver
sendtestemail
shell
showmigrations
sqlflush
sqlmigrate
sqlsequencereset
squashmigrations
startapp
startproject
test
testserver
$ django-admin startproject --help
创建django项目
$ django-admin startproject blog .
上一句命令就在当前项目根目录中构建了Django项目的初始文件。点代表项目根目录
重要文件说明:
- manage.py:本项目管理的命令行工具。应用创建、数据库迁移等都使用它完成
- blog/settings.py:本项目的核心配置工具。数据库、中间件、模板等
- blog/urls.py:URL路径映射配置。项目初始,只配置了/admin的路由
- blog/wsgi:定义WSGI接口信息。部署用,一般无需改动
数据库配置
使用数据库,需要修改默认的数据库配置
在主项目的settings.py下的DATABASES,默认使用的sqlite,修改为mysql。
DATABASES = {
'default': {
# 修改为自己mysql
'ENGINE': 'django.db.backends.mysql',
# 数据库的名称
'NAME': 'blog',
#数据库的使用者
'USER': 'xiaobai',
# 数据库的密码
'PASSWORD': 'xiaobai',
'HOST': '192.168.142.140',
# 需要与数据库的端口一致
'PORT': '3306',
}
}
配置项 | 说明 |
---|---|
HOST | 数据库主机,缺省是空字符串,代表localhost,如果是’/'开头表示使用Unix Socket连接 |
POST | 端口 |
USER | 用户名 |
PASSWORD | 密码 |
NAME | 库名 |
OPTIONS | 选项,字典类型 |
数据库引擎ENGINE
内建的引擎有
- ‘django.db.backends.postgresql’
- ‘django.db.backends.mysql’
- ‘django.db.backends.sqlite3’
- ‘django.db.backends.oracle’
MySQL数据库的驱动
https://docs.djangoproject.com/en/1.11/ref/databases/#mysql-db-api-drivers
Django支持MySQL5.5+
Django官方推荐使用本地驱动mysqlclient 1.3.7+
pip install mysqlclient
windows下可能发生安装错误 error: Microsoft Visual C++ 14.0 is required.解决方法
1、下载Visual C++ Redistributable Packages 2015、2017安装,但是即使安装后,确实看到了V14库,也不保证
安装mysqlclient就成功
2、直接安装编译好的wheel文件
mysqlclient-1.3.13-cp35-cp35m-win_amd64.whl ,python 3.5使用
mysqlclient-1.3.13-cp36-cp36m-win_amd64.whl ,python 3.6使用
mysqlclient-1.4.2-cp37-cp37m-win_amd64.whl, python 3.7使用
$ pip install mysqlclient-1.3.13-cp35-cp35m-win_amd64.whl
参考 https://stackoverflow.com/questions/29846087/microsoft-visual-c-14-0-is-required-unable-tofind-vcvarsall-bat
下载地址
https://www.lfd.uci.edu/~gohlke/pythonlibs/
---------------------------------------------------------------------------------
Linux、Mac请参照官网安装依赖库
https://pypi.org/project/mysqlclient/
但是效果并不好
创建应用
创建用户应用
$ python manage.py startapp user
创建应用后,项目根目录产生一个user目录,有如下文件:
- admin.py:应用后台管理声明文件
- models.py:模型层Model类定义
- views.py:定义URL响应函数或类
- migrations包:数据迁移文件生成目录
- apps,py:应用的信息定义文件
该应用完成以下功能: - 用户注册
- 用户登录
注册应用
在settings.py中,增加user应用
目的是为了后台管理admin使用,或迁移migrate使用
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'user',
]
模型Model
字段类型
缺省主键
缺省情况下,Django的每一个Model都有一个名为id的AutoField字段,如下
id=models.AutoField(primary_key=True)
如果显式定义了主键,这种缺省主键就不会被创建了
字段选项
参考https://docs.djangoproject.com/en/1.11/ref/models/fields/#field-options
值 | 说明 |
---|---|
db_column | 表中字段的名称,如果未指定,则使用属性名 |
primary_key | 是否主键 |
unique | 是否是唯一键 |
default | 缺省值,这个缺省值不是数据库字段的缺省值,而是新对象产生的时候被填入的缺省值 |
null | 表的字段是否可为null,默认为False |
blank | Django表单验证中,是否可以不填写,默认为False |
db_index | 字段是否有索引 |
关系类型字段类
类 | 说明 |
---|---|
ForeignKey | 外键,表示一对多,ForeignKey(‘production.Manufacturer’) |
ManyToManyField | 表示多对多 |
OneToOneField | 表示一对一 |
一对多时,自动创建会增加_id后缀
- 从一访问多,使用对象.小写模型类_set
- 从一访问一,使用对象.小写模型类
访问id对象.属性_id
创建User的Model类
- 基类models.Model
- 表明不指定默认使用_<model_name>。使用Meta类修改表明
from django.db import models
# Create your models here.
class User(models.Model):
class Meta:
db_table = 'user'
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=48, null=False)
email = models.CharField(max_length=64, unique=True, null=False)
password = models.CharField(max_length=128, null=False)
def __repr__(self):
return '<user {} {}>'.format(self.id, self.name)
__str__ = __repr__
Meta类的使用,参考:https://docs.djangoproject.com/en/1.11/ref/models/options/#django.db.models.Options.db_table
迁移Migration
迁移:从模型定义生成数据库的表
1、生成迁移文件
$ python manage.py makemigrations
Migrations for 'user':
user\migrations\0001_initial.py
- Create model User
生成如下文件
user
├─ migrations
├─ 0001_initial.py
└─ __init__.py
修改过Model类,还需要调用python manage.py makemigrations,然后migraie,迁移文件的序号会增加。
注意:
迁移的应用必须在settings.py的INSTALLED_APPS中注册。
不要随便删除这些迁移文件,后面的改动都是要依据这些迁移文件的
# 0001_initial.py 文件内容如下
# -*- coding: utf-8 -*-
# Generated by Django 1.11.22 on 2019-07-16 01:35
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='User',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('name', models.CharField(max_length=48)),
('email', models.CharField(max_length=64, unique=True)),
('password', models.CharField(max_length=128)),
],
options={
'db_table': 'user',
},
),
]
2、执行迁移生成数据库的表
$ python manage.py migrate
执行迁移,还同时生成了admin管理的表
查看数据库,user表创建好了,字段设置正确
Django后台管理
1、创建管理员
管理员用户名admin
密码adminadmin
$ manage.py createsuperuser
Username (leave blank to use 'asus'):admin
Email address:
Password:
Password (again):
Superuser created successfully.
2、本地化
settings.py中设置语言、时区
语言名称可以查看 django\contrib\admin\locale目录
LANGUAGE_CODE = 'zh-Hans' #'en-us'
USE_TZ = True
TIME_ZONE = 'Asia/Shanghai' #'UTC'
3、启动WEB Server
$ python manage.py runserver
默认启动8000端口
4、登录后台管理
后台登录地址 :http://127.0.0.1:8000/admi
5、注册应用模块
在user应用的admin.py添加
from django.contrib import admin
from .models import User
# Register your models here.
admin.site.register(User) # 注册
user就可以在后台进行增删改了
路由
路由功能就是实现URL模式匹配和处理函数之间的映射
路由设置妖在醒目的urls.py中设置,也可以多级设置库,在每一个应用中,建立一个urls,py文件路由映射
yrl函数
url(regex,view,kwargs=None,name=None)
regex:正则表达式,与之匹配的URL会执行对象的第二参数viex
view:用于执行与正则表达式匹配的URL请求
kwargs:视图使用的字典类型的参数
name:用来反向获取URL
urls.py内容如下
from django.conf.urls import url
from django.contrib import admin
from django.http import HttpRequest,HttpResponse,JsonResponse
def index(request:HttpRequest):
"""视图函数,请求进来返回响应"""
# res=HttpResponse(b'welcome to here')
# print(res.charset)
# return res
d={}
d['method']=request.method
d['path']=request.path
d['path_info']=request.path_info
d['GETparams']=request.GET
return JsonResponse(d)
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$',index),
url(r'^index$',index),#不同路径可以指向同一个函数
]
url(r’^index/
′
,
i
n
d
e
x
)
h
t
t
p
:
/
/
127.0.0.1
:
8000
/
i
n
d
e
x
/
可
以
访
问
h
t
t
p
:
/
/
127.0.0.1
:
8000
/
i
n
d
e
x
可
以
访
问
,
但
会
补
一
个
/
u
r
l
(
r
′
i
n
d
e
x
', index) http://127.0.0.1:8000/index/ 可以访问 http://127.0.0.1:8000/index 可以访问,但会补一个/ url(r'^index
′,index)http://127.0.0.1:8000/index/可以访问http://127.0.0.1:8000/index可以访问,但会补一个/url(r′index’, index)
http://127.0.0.1:8000/index 可以访问
http://127.0.0.1:8000/index/ 不可以访问
请求信息测试和JSON响应
from django.http import HttpRequest, HttpResponse, JsonResponse
def index(request:HttpRequest):
"""视图函数:请求进来返回响应"""
d = {}
d['method'] = request.method
d['path'] = request.path
d['path_info'] = request.path_info
d['GETparams'] = request.GET
return JsonResponse(d)
在项目中首页多数使用HTML显示,为了加载速度快,一般多使用静态页面。如果首页内容多,还有部分数据需要
变化,将变化部分使用A JAX技术从后台获取数据。
本次,为了学习模板技术,只将首页采用Django的模板技术实现。