Django
是一个简单易用的框架,提供了非常多有用的 api。Django
诞生于新闻网站的环境中,因此它提供很多了特性,非常适合内容类的网站,提供动态的,数据库驱动的信息。其次,框架的开发者对于让开发人员节省时间,编写更加容易维护的程序,同时保证程序运行的效率具有极大的兴趣。 让程序员节省时间,快乐工作(滑稽)
本教程基于
Python2.7
,Django 1.9
工作原理
大致步骤如下
- 用户通过浏览器请求一个页面
- 请求到达
Request Middlewares(中间件)
,中间件对request
做一些预处理或者直接response
请求 URLConf
通过urls.py
文件和请求的URL找到相应的View
View Middlewares
被访问,它同样可以对request
做一些处理或者直接返回response
- 调用
View
中的函数 View
中的方法可以选择性的通过Models
访问底层的数据- 所有的
Model-to-DB
的交互都是通过manager
完成的 - 如果需要,
Views
可以使用一个特殊的Context
Context
被传给Template
用来生成页面
a.Template
使用Filters
和Tags
去渲染输出
b. 输出被返回到View
c.HTTPResponse
被发送到Response Middlewares
d. 任何Response Middlewares
都可以丰富response
或者返回一个完全不同的response
e.Response
返回到浏览器,呈现给用户
Django的 MTV 模式
Django
是一个基于MVC
构造的框架。但是在Django
中,控制器接受用户输入的部分由框架自行处理,所以 Django
里更关注的是模型(Model)、模板(Template)和视图(Views),称为 MTV模式
。它们各自的职责如下:
层次 | 职责 |
---|---|
模型(Model),即数据存取层 | 处理与数据相关的所有事务:即与数据库打交道 |
模板 (Template),即表现层 | 处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。 |
视图(View),即业务逻辑层 | 存取模型及调取恰当模板的相关逻辑。模型与模板的桥梁。 |
从以上表述可以看出Django
视图不处理用户输入,而仅仅决定要展现哪些数据给用户,而Django
模板 仅仅决定如何展现Django
视图指定的数据。或者说, Django
将MVC
中的视图进一步分解为 Django
视图 和 Django
模板两个部分,分别决定 “展现哪些数据” 和 “如何展现”,使得Django
的模板可以根据需要随时替换,而不仅仅限制于内置的模板。
至于MVC
控制器部分,由Django
框架的URLconf
来实现。URLconf
机制是使用正则表达式匹配URL,然后调用合适的Python
函数。程序员把控制层东西交给Django
自动完成了。 只需要编写非常少的代码完成很多的事情。所以,它比MVC
框架考虑的问题要深一步,因为我们程序员大都在写控制层的程序。现在这个工作交给了框架,仅需写很少的调用代码,大大提高了工作效率。
Django 的配置
安装
直接利用 pip
安装
pip install django==1.9
新建一个项目
一般来说新建一个项目都有以下步骤
# 新建目录
mkdir tutorial
cd tutorial
# 新建虚拟环境
virtualenv env
source env/bin/activate # Windows使用 env\Scripts\activate
#在 虚拟环境中安装依赖
pip install django
pip install djangorestframework
#新建 项目
django-admin.py startproject tutorial . # 注意后面的 '.'
cd tutorial
django-admin.py startapp quickstart
cd ..
创建表和管理员
# 创建一个表
python manage.py migrate
# 添加一个管理员
python manage.py createsuperuser
一个 Django 项目的结构
manage.py
manage.py
则是每个Django
项目中自动生成的一个用于管理项目的脚本文件。
check
- 检查整个Django
项目是否存在常见问题。dbshell
- 运行数据库的shell
diffsettings
- 显示当前设置文件与Django
的默认设置之间的差异。flush
- 从数据库中删除所有数据。已应用的迁移不会被清除。只删除具体数据,不删除数据表!如果您希望从空数据库启动并重新运行所有迁移,则应该删除并重新创建数据库,然后再运行migrate
,这样会连原来的数据表都删了。makemigrations
- 相当于在该app
下建立migrations
目录,并记录下你所有的关于models.py
的改动,比如0001_initial.py
, 但是这个改动还没有作用到数据库文件migrate
- 将该改动作用到数据库文件,比如产生table
,修改字段的类型等。runserver
- 运行shell
- 带有Django
环境的Python
交互式解释器,也就是命令行环境startapp
- 创建新的app
。startproject
- 新建工程。test
- 运行所有已安装的app的测试代码。changepassword
- 改变密码createsuperuser
- 创建超级用户
Django APP
init.py
空文件,其作用是声明APP
为一个独立的模块
wsgi.py
Web服务器的网关接口。Python
应用与Web服务器交互的接口,一般不需要做任何修改。
urls.py
负责配置Django
下所有的页面
settings.py
包括以下内容:
- 项目文件所在的根目录
- 自动生成的加密密钥,生产环境下使用,加密后用户在以开发者模式看前端界面时看到的均是加密后的信息
debug
模式,上线时必须要关闭,为True
时,网页端的一个log或者错误会在界面上提示,方便开发者查找错误原因。如果设置为False
,则为生产环境,此时ALLOWED_HOSTS
必须要配置,否则运行时命令行会报错,比如配置为127.0.0.1
,就可以访问。- 所有的应用,包括
Django
自带的 Django
提供的一些工具集(中间件)url
配置文件,一般默认指向的是项目文件下的urls.py
- 模版,静态文件和数据库的一些配置。 -
- 密码认证配置项
- 国际化配置,包括语言、时区等
setting.py
的设置
转自
setting配置汇总
1、app路径
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app1.apps.App1Config',
# 默认已有 如果没有只要添加app名称即可 例如: 'app1'
# 新建的应用都要在这里添加
]
2、数据库配置
如果使用django
的默认sqlite3
数据库则不需要改
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
如果使用mysql
数据库需要将上述数据库注掉修改如下
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'blog', #你的数据库名称 数据库需要自己提前建好
'USER': 'root', #你的数据库用户名
'PASSWORD': '', #你的数据库密码
'HOST': '', #你的数据库主机,留空默认为localhost
'PORT': '3306', #你的数据库端口
}
}
并且需要在应用的init.py
文件添加
import pymysql
pymysql.install_as_MySQLdb()
详情可以查看:http://www.jb51.net/article/128674.htm
3、sql语句
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
当你的操作与数据库相关时 会将我们的写的语句翻译成sql语句在服务端打印。
4、静态文件目录
STATIC_URL = '/static/' #调用时目录
STATICFILES_DIRS=[
os.path.join(BASE_DIR,"static"), #具体路径
]
5、如果数据库中的UserInfo
(用户表)继承django
内置AbstractUser
1)model
需导入
from django.contrib.auth.models import AbstractUser
2)配置文件
AUTH_USER_MODEL = "应用名.UserInfo"
6、中间件
自己写的中间件,例如在项目中的md文件夹下md.py文件中的M1与M2两个中间件
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'md.md.M1',
'md.md.M2',
]
注意自己写的中间件,配置要写在系统中的后面
7、session存储的相关配置
Django
默认支持Session
,并且默认是将Session
数据存储在数据库中,即:django_session
表中。
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)