Bonky Zhu
If someone is able to show me that what I think or do is not right, I will happily change, for I seek the truth, by which no one was ever truly harmed. It is the person who continues in his self-deception and ignorance who is harmed.

Django 入门

Django是一个简单易用的框架,提供了非常多有用的 api。Django诞生于新闻网站的环境中,因此它提供很多了特性,非常适合内容类的网站,提供动态的,数据库驱动的信息。其次,框架的开发者对于让开发人员节省时间,编写更加容易维护的程序,同时保证程序运行的效率具有极大的兴趣。 让程序员节省时间,快乐工作(滑稽)

本教程基于Python2.7, Django 1.9

工作原理

大致步骤如下

  1. 用户通过浏览器请求一个页面
  2. 请求到达Request Middlewares(中间件),中间件对request做一些预处理或者直接response请求
  3. URLConf通过urls.py文件和请求的URL找到相应的View
  4. View Middlewares被访问,它同样可以对request做一些处理或者直接返回response
  5. 调用View中的函数
  6. View中的方法可以选择性的通过Models访问底层的数据
  7. 所有的Model-to-DB的交互都是通过manager完成的
  8. 如果需要,Views可以使用一个特殊的Context
  9. Context被传给Template用来生成页面
    a. Template使用FiltersTags去渲染输出
    b. 输出被返回到View
    c. HTTPResponse被发送到Response Middlewares
    d. 任何Response Middlewares都可以丰富response或者返回一个完全不同的response
    e. Response返回到浏览器,呈现给用户

1343703-20180821113305673-1835982763

Django的 MTV 模式

Django是一个基于MVC构造的框架。但是在Django中,控制器接受用户输入的部分由框架自行处理,所以 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),称为 MTV模式。它们各自的职责如下:

层次 职责
模型(Model),即数据存取层 处理与数据相关的所有事务:即与数据库打交道
模板 (Template),即表现层 处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。
视图(View),即业务逻辑层 存取模型及调取恰当模板的相关逻辑。模型与模板的桥梁。

从以上表述可以看出Django 视图不处理用户输入,而仅仅决定要展现哪些数据给用户,而Django 模板 仅仅决定如何展现Django视图指定的数据。或者说, DjangoMVC中的视图进一步分解为 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服务器交互的接口,一般不需要做任何修改。

img

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,默认修改之后才保存(默认)

资料

  1. 新手怎么读懂一个中型的Django项目

  2. django_百度百科

  3. The Django Book 2.0--中文版

  4. 知识详解1:django项目结构及项目目录详解 - 简书

  5. Django -- settings 详解

Share

You may also like...

发表评论