首页 > 技术文章 > 【Django】01、初次认识django

wuhuaxing 2018-05-10 11:36 原文

一、Django结构

1、组件

  • Middleware(中间件):包括request、view、exception、response
  • URLConf(url映射关系)
  • Template(模板系统)

2、MVC框架(models+views+controller),模型、视图、控制器

django采用MTV框架模式,所有的mvc/mtv技术框架核心思想都是基于分层思想来构建的,各层职责明确。这种设计模式关键的优势在于各种组件都是 松散结合 的。这样,每个由 Django驱动 的Web应用都有着明确的目的,并且可独立更改而不影响到其它的部分。

  • Models:负责数据模型的建立与数据处理,主要负责数据库的交互
  • Template:视图层,相当于mvc中的views
  • Views:业务逻辑,功能处理,相当于mvc中的controller
    img

3、Web服务框架实质

  • 所有的web都遵循http/https协议,而http/https本身通过tcp来建立连接,当从服务器端获取数据后,关闭连接。重新发起一次请求时,需要再次建立一个连接,所以说http协议是一种无状态连接的协议。
  • 既然http是通过tcp连接来获取数据,那本质上来说,就是通过一次socket连接来从服务器端获取数据后呈现在客户端

4、简单的web服务器

以下代码即所有的web框架实现的核心原理

import socket

def httpHandler(clientSocket):
    buffer=clientSocket.recv(1024)
    clientSocket.send(b'hello')
def main():
    client_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    address=('localhost',9000)
    client_socket.bind(address)
    client_socket.listen(5)
    print('listening on port 9000')
    while True:
        conn,ip=client_socket.accept()
        httpHandler(conn)
    client_socket.close()

if __name__=="__main__":
    main()

5、关于__name__=="main"的拓展

一个Python文件执行有两种方法,一是直接被作为脚本执行,二是被其他python脚本调用(模块重用)

因此__name__=="main" 就是一个属性决定了以什么方式运行。

test1.py

print "I'm the first."
  if __name__=="__main__":
       print "I'm the second."   
#输出结果是  I'm the first.
            I'm the second.

test2.py

import test1
#输出结果是  I'm the first.
#因为引用了test1.py 所以__name__就是test1,__main__是test2,if条件不成立

在当前脚本执行时__name__包含.py后缀名,被调用时不包含.py;__main__就是当前执行文件名称(包含.py)

二、Django工程

1、文件说明

project目录下

  • manage.py: 命令行工具,允许以多种方式与Django项目交互
  • init.py:让python将该目录当做一个开发包(一组模块),所需文件
  • setting.py: 全局设置、配置文件
  • urls.py: 路由映射文件,项目的URL设置
  • wsgi.py: web服务器网关接口(Web Server Gateway Interface)

app目录下

  • admin.py: admin后台管理
  • init.py: 作用同project目录下文件
  • migrations.py: 数据库相关目录
  • models.py: 主要用一个 Python 类来描述数据表。 称为模型(model) 。 运用这个类,你可以通过简单的 Python 的代码来创建、检索、更新、删除 数据库中的记录而无需写一条又一条的SQL语句。
  • views.py: 包含了页面的业务逻辑。latest_books()函数叫做视图

2、项目工程的配置

django-admin startproject mysite    #创建项目
django-admin startapp blog  #创建应用

在项目和应用都创建完之后

# 将app在Django中注册
INstallen_APPS = [
    ...
    'blog',
]
# 视图目录
TEMPLATES = [
    { 'DIRS': [os.path.join(BASE_DIR,'templates')],}
]
# 数据库配置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',   #要使用MySQL记得在项目__init__.py中导入包
 
        'NAME': 'wuhuaxing2018',    #建立数据库的名字
        'USER':'root',
        "PASSWORD":'root',
        "HOST":"localhost",
        "PORT":"3306",
    }
}
# 静态目录配置
STATIC_URL = '/static/'
STATIC_DIRS =[
    os.path.join(BASE_DIR,"statics"),
]

# 语言与时区配置

#LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans'
#TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai'

加载MySQL数据库驱动

# project\__init__.py
import pymysql
pymysql.install_as_MySQLdb()

3、路由分发配置

project\urls.py

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    #引入APP应用的urls
    url(r'',include("APP.urls")),
]

project\app\urls.py

urlpatterns = [
    #重定向作用,每个路由对应视图去处理函数
    url(r"^$",views.index),
    url(r"^home/$",views.home),
    url(r"^market/$", views.market),
    url(r"^cart/$", views.cart),
    url(r"^mine/$", views.mine),
]

三、Django执行流程

1.用户通过浏览器发送请求

2.请求到达request中间件,中间件对request请求做预处理或者直接返回response

3.若未返回response,会到达url路由,找到对应视图函数

4.视图函数做相应预处理或直接返回response

5.View中的方法可以选择性的通过Models访问底层的数据

6.取到相应数据后回到django模板系统,templates通过filter或tags把数据渲染到模板上

7.返回response到浏览器展示给客户

推荐阅读