一、MVC和MTV框架
-
MVC
所谓MVC,就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的、松耦合的方式连接在一起,模型负责业务对象与数据库相关,视图负责与用户的交互(页面),控制器接受用户的输入调用模型和视图完成用户的请求(就是url分发) -
MTV
Django的模式就是MTV- M 代表模型(Model): 负责业务对象和数据库的关系映射(ORM)。
- T 代表模板 (Template):负责如何把页面展示给用户(html)。
- V 代表视图(View): 负责业务逻辑,并在适当时候调用Model和Template。
- 除了以上三层之外,还需要一个URL分发器,它的作用是将一个个URL的页面请求分发给不同的View处理,View再调用相应的Model和Template
二、django的下载安装
官网地址:https://www.djangoproject.com/download/
目前版本是用的1.11版本的,等2020年再去学习2.2版本的
-
cmd终端创建启动Django项目
-
下载Django:
pip3 install django==1.11.9 -
创建一个django project
django-admin startproject mysite 创建了一个名为"mysite"的Django 项目:因为执行的pip.exe,所以Django会安装在pip所在的文件下;
当发现scripts文件夹中有Django,就安装成功,就不用再去配置环境;
安装完成后,去创建一个django project,若出现以下情况,说明环境变量没有配置好,要把你安装的Django的路径配置在环境变量中
-
创建的项目文件介绍
创建成功后,目录会生成mysite的工程,目录如下:- manage.py ----- Django项目里面的工具,通过它可以调用django shell和数据库,启动关闭项目与项目交互等,不管你将框架分了几个文件,必然有一个启动文件,其实他们本身就是一个文件。
- settings.py ---- 包含了项目的默认设置,包括数据库信息,调试标志以及其他一些工作的变量。
- urls.py ----- 负责把URL模式映射到应用程序。
- wsgi.py ---- runserver命令就使用wsgiref模块做简单的web server,后面会看到renserver命令,所有与socket相关的内容都在这个文件里面了,目前不需要关注它。
-
运行项目
python manage.py runserver 127.0.0.1:8080
#此时已经可以启动django项目了,只不过什么逻辑也没有呢
通过指令运行项目的时候,可以不写ip地址、端口
如果不写,默认是127.0.0.1
python manage.py runserver 8080
如果连端口都不写,默认是8000端口
python manage.py runserver停止项目:ctrl+c
当出现以上效果,说明项目已经启动成功了,就可以通过网页输入127.0.0.1:8080来访问了,效果如下:
-
在mysite下创建应用
会发现,上面没有view视图函数的文件等等,这些文件可以理解为应用,一个项目可以有多个应用,比如微信,就有支付应用、聊天应用、小程序、朋友圈等等...每个应用都应该有自己的逻辑内容,需要自己去单独创建应用
python manage.py startapp app01
#通过执行manage.py文件来创建应用,注意:应该在这个manage.py的文件所在目录下执行这句话,因为其他目录里面没有这个文件
cmd执行命令后,除了之前有的manage.py和mysite文件夹,又新生成了一个新的文件夹app01,文件夹内容如下: -
pycharm创建启动Django项目
创建Django的项目,很少用命令行了,用 pycharm就能创建
-
在 File 下选 New Project
-
配置Django选项
-
创建,在新窗口打开
-
生成的文件目录如下:
其中的templates是pycharm帮助我们直接创建好的,放一些模板,也就是html文件。
-
运行项目:
点击运行后,出现以下情况,就是启动项目成功了
此时,在网页输入127.0.0.1:8000,就可以访问了
这是因为我们还没有写任何的逻辑,然后,我们做一个简单的登录功能
-
基于Django实现一个简单的示例
我们做一个登录的页面的web项目,浏览器输入一个网址就能得到这个登录的web页面
-
先找urls.py
from django.conf.urls import url
from django.contrib import admin
from app01 import views # 引入视图的函数的文件urlpatterns = [ # url(r'^admin/', admin.site.urls), url(r'^index/', views.index), # 模仿写出路由的配置 # 配置路径,r'^/index/',这个前置导航斜杠不需要添加. # 正则,可以让路径不用写死,index/dsad/qweq/fdsf/...也能匹配到 ]
-
再写视图函数 views
from django.shortcuts import render# Create your views here. def index(request):# request是一个形参,接受所有请求的内容 return render(request,'login.html')
render后面可以直接写html文件的原因:
之所以可以直接写 login.html,是因为settings.py的配置文件中已经配置好了路径,可以直接拿到- 在settings.py的配置文件中有
- TEMPLATES 中有一项 'DIRS': [os.path.join(BASE_DIR, 'templates')]
- BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(file)))
- abspath(file)是settings本文件
- os.path.dirname(os.path.abspath(file))是settings的父目录文件夹 third_pro
- os.path.dirname(os.path.dirname(os.path.abspath(file))) 是整个这个项目的文件夹 third_pro
- 所以 BASE_DIR 就是这个项目的文件夹,也就是最外层的那个文件夹 third_pro
- 'DIRS': [os.path.join(BASE_DIR, 'templates')] 是路径的拼接,就可以直接找到templates里面的html文件了
- 在settings.py的配置文件中有
-
写模板 templates,在这里创建html文件
<h1>欢迎来到登录页面</h1> <form action=""> 用户名:<input type="text" name="username"> 密 码:<input type="text" name="password"> <input type="submit"> </form>
注意:name属性必须要有,因为通过表单提价数据的时候,可以把用户输入的值带过去
-
这样就简单完成了一个web项目
通过输入127.0.0.1:8000/index,就能拿到我们写好的页面 -
完善Django实现的登录功能
用户输入用户名密码,在后台判断输入的用户名密码是否正确
首先 区分一下 get请求 和post请求
-
form表单默认get请求
用户提交的数据还是返回给 index 那个路径
request.GET -- GET请求发送来的所有数据,queryDict类型<input name='username'> request.GET.get('username') # 获取 name='username' 的 input 标签用户输入的内容
-
post请求
request.POST -- POST请求发送来的所有数据,queryDict类型<input name='username'> request.POST.get('username') # 获取 name='username' 的 input 标签用户输入的内容
因为要获取用户提交的数据,表单提交有两种方法:
-
get请求数据:
from django.shortcuts import render,HttpResponse
def index(request):
print(request.GET) #<QueryDict: {'username': ['dazhuang'], 'password': ['123']}>
username = request.GET.get('username')
password = request.GET.get('password')
print(username,password)
if username == 'dazhuang' and password == '123':
return HttpResponse('登录成功!') --- 回复字符串数据
else:
return HttpResponse('失败!')
return render(request, 'login.html')
出现问题:当直接通过路径请求页面,是get请求,form表单提交数据也是get请求,会分不清,所以请求页面用get请求,form表单提交数据用post请求
- post请求数据:
views视图函数文件写:
def index(request):
print(request.method) #'POST' 'GET'
if request.method == 'GET':
return render(request,'login.html')
else:
# print(request.GET)
print(request.POST)
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'dazhuang' and password == '123':
return HttpResponse('登录成功!')
else:
return HttpResponse('登录失败!')
html文件:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Bootstrap 101 Template</title>
</head>
<body>
<h1>欢迎来到登录页面</h1>
<form action="/index/" method="post"> # 给一个method属性规定post请求
用户名:<input type="text" name="username">
密 码:<input type="text" name="password">
<input type="submit">
</form>
</body>
</html
settings文件:
post请求提交数据时关掉一个认证机制,settings配置文件中
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',
]
最终效果:
输入正确的用户名、密码:dazhuang、123,提交,
显示登录成功,否显示登录失败
一些注意的点:
- urls.py里面需要注意的问题
url(r'^index/', views.index), 第一个参数:路径正则字符串 第二个参数:对应的视图函数 - views.py
def login(request):
获取请求方法:request.method--'GET','POST'
request.GET -- GET请求发送来的所有数据,queryDict类型
request.POST -- POST请求发送来的所有数据,queryDict类型
request.POST.get('username')
request.GET.get('username')
return HttpResponse('字符串') --- 回复字符串数据
retuen render(request,'login.html')
三、简单总结
-
django下载安装
下载:pip install django==1.11.9
创建项目
django-admin startproject qingqing
cd qingqing
启动项目:python manage.py runserver 127.0.0.1:8001
cd qingqing
创建app:python manage.py startapp xiaoqing需要在项目的配置文件settings.py中添加一个app的配置
INSTALL_APPS = [
'xiaoqing', app名称
]INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 以下两种写法都可以
'app01.apps.App01Config',
#'app01',
] -
两个框架模式
MVC
M:models数据库相关
V:views 视图逻辑相关
C:controller控制器 url分发 不同的路径找到不同的视图函数
MTV
M:models数据库相关
T:templates模板 ,HTML文件
V:views 视图逻辑相关
+ url控制器 不同的路径找到不同的视图函数
MVVM