一、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
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到浏览器展示给客户