03 初识Django
1. MVC与MTV模型
MVC
Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的、松耦合的方式连接在一起,模型负责业务对象与数据库的映射(ORM);视图负责与用户的交互(页面); 控制器接受用户的输入, 调用模型和视图, 完成用户的请求.

mvc主要用于web框架,常用的开发语言,有java,php,node.js等等。
web框架应用最广泛就是PHP了,它只能做web开发,而且开发效率很快。
MTV
Django的MTV模式本质上和MVC是一样的,为了各组件间保持松耦合关系,只是定义上有些许不同,Django的MTV分别是值:
M 代表模型(Model): 负责业务对象和数据库的关系映射(ORM)。
T 代表模板 (Template):负责如何把页面展示给用户(html)。
V 代表视图(View): 负责业务逻辑,并在适当时候调用Model和Template。
除了以上三层之外,还需要一个URL分发器,它的作用是将一个个URL的页面请求分发给不同的View处理,View再调用相应的Model和Template,MTV的响应模式如下所示:*****

一般是用户通过浏览器向我们的服务器发起一个请求(request),这个请求回去访问视图函数,(如果不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户),视图函数调用模型,模型去数据库查找数据,然后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。
这里面最难的部分是model。django 有一个ORM,它是专门来操作数据库的。这套语法,需要大量练习才能掌握。
MVC和MTV模型的区别:
MVC:
M : model (与数据库打交道)
V : views (存放html文件)
C : Controller(逻辑控制部分)
MTV
M : model (与数据库打交道)
T : templates (存放html文件)
V : views (逻辑处理)
路由控制层(分发哪一个路径由哪一个视图函数处理),它没有单独的分层。它作为URL分发器,将url请求分发给不同的view处理
2. Django的下载与基本命令
下载Django:
pip3 install django
pip install django==1.11.18 -i https://pypi.douban.com/simple/
2.1 创建一个django project
windows用户,以管理员身份打开一个cmd窗口。进入一个空目录,运行以下命令:
django-admin startproject mysite
当前目录下会生成同名mysite的项目,mysite是项目名。目录结构如下:
mysite/ ├── manage.py # 管理文件 └── mysite # 项目目录 ├── __init__.py ├── settings.py # 配置 ├── urls.py # 路由 --> URL和视图函数的映射关系(对应关系) └── wsgi.py # runserver命令就使用wsgiref模块做简单的web server,封装了socket
manage.py ----- Django项目里面的工具,通过它可以调用django shell和数据库等。
settings.py ---- 包含了项目的默认设置,包括数据库信息,调试标志以及其他一些工作的变量。
urls.py ----- 负责把URL模式映射到应用程序。
manage.py : 它不仅是启动文件,它还是与Django交互的文件。比如:
python manage.py runserver : 运行项目
python manage.py startapp : 创建应用
如果运行项目时,不指定端口,默认监听本机的8000端口。
setting.py的简单讲解
#settings的绝对路径,再往上找,再上找,就是项目目录 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True# 上线的时候要改成false ALLOWED_HOSTS = ['*'] #允许的ip,* 代表所有的都允许 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')],# template文件夹位置,路径拼接 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] deROOT_URLCONF = 'mysite2.urls'ROOT_URLCONF = 'mysite2.urls' ROOT_URLCONF = 'mysite2.urls' # url的位置,在mysite2的路径下 #如果在pycharm里面移动更改它的位置,会提示search for reference,点击√,会自动将ROOT_URLCONF的路径修改 # Static files (CSS, JavaScript, Images) STATIC_URL = '/static/' # 别名. HTML中使用的静态文件夹前缀 STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static') # 静态文件存放位置 ]
2.2 在mysite目录下创建应用
进入mysite目录, 创建应用blog,要进入项目路径,在里面执行manage.py
python manage.py startapp blog
目录结构如下:
mysite/ ├── blog │ ├── admin.py │ ├── apps.py │ ├── __init__.py │ ├── migrations │ │ └── __init__.py │ ├── models.py │ ├── tests.py │ └── views.py ├── manage.py └── mysite ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py
views.py---存放与该app相关的视图函数
models---存放与该app相关的表结构,与数据库打交道
templates目录,它是用来存放html文件的。
从上面的目录结构可以看出,mysite目录下有一个blog。那么顶层的mysite,叫做项目。底层的blog叫做应用。比如微信是一个项目。聊天,朋友圈,支付...都是应用。项目是必须包含应用的,项目可以包含多个应用。
mysite下的mysite,是全局文件,它有2个全局配置文件,一个是settings.py(项目配置文件),一个是urls.py(路由控制文件)。
wsgi.py是封装socket,用来接收和响应请求的。这个文件,从来都不需要动。
2.3 启动django项目
python manage.py runserver ip port # 如果不写,默认是本机ip,端口号8000
3. 基于Django实现的一个简单示例
url控制器
修改mysite目录下的urls.py,增加index路径. 注意:index后面不要加括号。直接views.index即可. 必须导入blog应用的views模块,否则它找不到对应的视图函数
from django.contrib import admin from django.urls import pathfrom blog import views urlpatterns = [ path('admin/', admin.site.urls), path('index/',views.index), path('login/',views.login), path('auth/',views.auth), ]
视图
from django.shortcuts import render import datetime def index(request): now=datetime.datetime.now() ctime=now.strftime("%Y-%m-%d %X") return render(request,"index.html",{"ctime":ctime}) def login(request): return render(request,"login.html") def auth(request): print(request.path) # 路径 print(request.method) # 请求方式 print(request.GET) # GET数据 print(request.POST) # POST数据 return HttpResponse("OK")
request,它是一个对象。存储了请求信息,比如请求路径,请求方式,GET数据,POST数据...等等。
request参数必须要有,不管你用不用它。
模板
在templates目录下创建文件login.html. post请求
在templates目录下创建文件login.html. post请求 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/auth/" method="post"> # action后面跟着是url,如果不填,就是当前 <lable>用户名</lable><input type="text" name="user"/> <lable>用户名</lable><input type="password" name="pwd"/> <input type="submit"> </form> </body> </html>
访问登录页面,输入数据,点击提交

页面输出403,被CSRF拦截了。
CSRF:跨站请求伪造,常缩写为CSRF或者XSRF,是一种对网站的恶意利用。如何避免CSRF。修改settings.py里面的MIDDLEWARE 配置项,关闭CSRF
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', ]
再次访问url,输入表单信息,点击提交。输出ok,表示正常。
总结
1. MVC和MTV MTV 路由控制层(分发哪一个路径由哪一个视图函数处理) V : views (逻辑处理) T : templates (存放html文件) M : model (与数据库打交道) django,由4部分组成。路由控制+MTV 2.Django的命令: 1)下载安装 pip install django==1.11.16 -i 源 2)创建项目 django-admin startproject 项目名称 mysite manage.py : 启动文件 交互文件 mysite settings.py :配置文件 urls.py :路由控制层(分发哪一个路径由哪一个视图函数处理) wsgi.py :socket 3)启动项目 cd 项目根目录下 python manage.py runserver # 默认使用127.0.0.1:8000 命令后面还可以指定参数: python manage.py runserver 80 # 127.0.0.1:80 python manage.py runserver 0.0.0.0:80 # 0.0.0.0:80指定IP和端口,冒号分割 4)创建APP python manage.py startapp app名称 mysite manage.py : 启动文件 交互文件 mysite settings.py :配置文件 urls.py :路由控制层(分发哪一个路径由哪一个视图函数处理) wsgi.py :socket app01 views : 存放视图函数文件 models :数据库打交道 app02 views : 存放视图函数文件 models :数据库打交道 注册 5)数据库相关 python manage.py makemigrations # 记录model的变更情况 python manage.py migrate # 将变更记录同步到数据库中 3. Django的配置 1) django项目中的APP INSTALLED_APPS =[ 'app01', 'app01.apps.App01Config', ] 2)MIDDLEWARE 中间件 django.middleware.csrf.CsrfViewMiddleware 注释掉后可以提交POST 3)TEMPLATES 模板 'DIRS': [os.path.join(BASE_DIR, 'templates')], 4) DATABASES 数据库 ENGINE: mysql NAME: 数据库名称 HOST: '127.0.0.1' PORT: 3306 USER: 用户名 PASSWORD 密码 '' 5). 静态文件 STATIC_URL = '/static/' # 别名 STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), ]

浙公网安备 33010602011771号