django学习第一天---MVC和MTV框架,request对象的属性,url路由系统
jinja2模板渲染简单使用
- 下载安装
pip install jinja2
使用示例
- 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>Title</title>
</head>
<body>
<h1>姓名:{{name}}</h1>
<h1>爱好:</h1>
<ul>
{% for hobby in hobby_list %}
<li>{{hobby}}</li>
{% endfor %}
</ul>
</body>
</html> - 视图中写法
from wsgiref.simple_server import make_server
from jinja2 import Template def index():
with open("index2.html", "r",encoding='utf-8') as f:
data = f.read()
template = Template(data) # 生成模板文件
ret = template.render({"name": "于谦", "hobby_list": ["烫头", "泡吧"]}) # 把数据填充到模板里面
return [bytes(ret, encoding="utf8"), ]
MVC和MTV框架
MVC
web服务器开发领域里著名的MVC模式,所谓MVC就是把web应用分为模型(M),控制器(C)和视图(V)三层,结构说明如下:
M:models 数据库相关操作 V:views 视图,也就是业务逻辑相关操作 C:controller 控制器,也就是通过路径找到对应视图函数MTV
Django的MTV模式本质上和MVC的一样的,也是为了各组件间保持松藕合关系,只是定义上有些许不同。
M:models 数据库相关操作 T:templates html文件相关操作(模板渲染等) V:views 视图,也就是业务逻辑相关操作 再加上一个url控制器,也就是通过路径找到对应视图函数
WSGI
- WSGI(Web Server Gateway Interface)就是一种规范,它定义了web应用程序与web服务器程序之间的接口格式,实现web应用程序与web服务器程序间的解耦。
开发的项目分为两个部分的程序 1、服务器程序 socket相关功能的模块,wsgiref、uwsgi等等,负责接收网络请求并解析网络请求相关数据,分装加工成一些可用的数据格式,格式大家都是统一的,方便应用程序的开发 2、应用程序 就是使用接收到的网络请求相关数据,进行逻辑代码的开发,比如数据库相关操作,数据结构的调整,文件操作等等。。
django
- Django是MTV模式架构的框架。历史版本介绍,参考官网。
- 下载安装
pip install django==1.11.9 - 创建项目
可以通过指令来创建,将来还可以通过IDE来进行创建,先看指令的写法
django-admin startproject mysite #mysite是自己的项目名称
执行上面的指令之后会生成如下的目录,当前目录下会生成mysite的工程,里面有个主目录和我们创建的项目目录同名,在项目目录下有个manage.py文件,在主目录下有setting.py\urls.py\wsgi.py,每个文件的功能介绍如下:
manage.py ----django项目里面的工具,通过它可以调用django shell和数据库,启动关闭项目与项目交互等,不管你将框架分了几个文件,必然有一个启动文件,其实他们本身就是一个文件 settings.py ----包含了项目的默认设置,包括数据库信息,调试标志以及其他一些工作的变量 urls.py ---- 负责把URL模式映射到应用程序 wsgi.py ---- runserver命令就使用wsgiref模块做简单的web server,后面会看到runserver命令,所有与socket相关的内容都在这个文件里面了,目前不需要关注它
在一个项目中可以有多个应用,每个应用完成项目的部分功能,比如微信项目,其中有很多应用,比如朋友圈功能、聊天、支付等等。在django框架看来,每个应用都有自己的逻辑部分,数据库部分等等,所以我们进行业务逻辑开发的时候,需要创建应用在写逻辑。
运行项目
- 命令运行
python manage.py runserver 127.0.0.1:8000 ip和port可以不用写,不写的话,默认是 127.0.0.1:8000 运行之后,通过浏览器访问127.0.0.1:8000,当看到页面为It worked!表示成功
创建应用
- 创建应用的指令如下:需要借助到我们创建的项目中的manage.py文件
python manage.py startapp app01 #app01为创建的应用名称 - 创建完应用后的目录介绍
models.py 数据库相关内容 views.py 视图,业务逻辑代码相关内容 tests.py 用来写一些测试代码,用来测试我们自己写的视图 ...其他的后面再说
pycharm创建django框架结构项目
- 需要用到专业版,此处省略,自己百度创建
通过django来完成一个简单的web项目
第一步 创建视图函数
在应用文件夹下面的views.py文件中写视图函数,比如: def home(request): #request--environ 请求相关数据,request叫作HTTPRequest对象 return render(request,'home.html') #render方法用来打开html文件,对文件进行模板渲染,第一个参数是request,第二个参数是html文件路径(这里只写了文件名称,因为django会自动去templates文件下面去找html文件),渲染完成后,返回响应页面数据,最终交给wsgi中的socket将页面数据返回给客户端。第二步:创建html文件
如果视图响应的是一个html文件,那么就需要再项目目录下templates文件夹下创建一个html文件。
为什么django能够自动找到templates文件夹下面的html文件呢?也就是我们使用render方法时,只写了一个html文件名称,就能够自动找到这个html文件,是因为在django的默认配置中有一个关于templates模板相关功能的配置项,里面指定了html文件的存放目录,找到主目录下面的settings.py,打开这个文件,找到TEMPLATES这个配置,内容如下:```
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 项目根路径 TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')] #DIRS指的就是html文 件存放路径的配置,注意,有些版本的django或者通过指令来创建项目时,这个DIRS的配置是空的,需要我们自己指定html文件的存放路径,所以如果你发现这个DIRS为空,我们需要自定来配置路径,可以按照现在这种方式来写
,
'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',
],
},
},
]
```
第三步 创建url路径和函数的映射关系
在项目主目录的urls.py文件中的urlpatterns中写上如下内容
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/',admin.site.urls),#这个是django内置的 url(r'^home/',views.home) ]
url中正则路径如何找到对应的函数,简单分析
#伪代码 import re path = request.path 当前请求路径 for item in urlpatterns: ret = re.match(item.regex,path) #item.regex -- ^home/ if ret: item.func(request) #item.func--views.home 函数 break else: pass
简单介绍几个request对象的属性
- 在views.py文件的视图函数中打印以下几个属性
def home(request): print(request) #wsgi封装的一个对象,WSGIRequest类的对象 print(request.path) #/home/ 请求路径 print(request.method) #GET 请求方法 print(request.POST) #获取post请求提交过来的数据 #<QueryDict:{'username':['root'],'password':['123']}> uname = request.POST.get('username')#取出username数据 return render(request,'home.html')
完成一个简单登录功能
views.py内容如下
一个视图函数搞定登录功能 def login(request): if request.method == 'GET': return render(request,'login.html') else: print(request.POST) #<QueryDict:{'username':['root'],'password':['123']}> uname = request.POST.get('username') pwd = request.POST.get('password') if uname == 'root' and pwd == '123': return render(request,'xx/home.html') else: return HttpResponse("用户名或密码错误!重新登录")urls.py内容如下
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^home/',views.home),
url(r'^login',views.login), ]
```
login.html内容如下
<form action='/login/' method='post'> 用户名:<input type='text' name='username'> 密码:<input type='password' name='password'> <button>提交</button> </form>
url路由系统
在django中,url中的路径写法是正则,正则里面有无名分组正则,有有名正则分组,那么对应django中的功能,我们称之为无名分组路由和有名分组路由
无名分组路由
看写法,urls.py文件中内容如下
```
urlpatterns = [
url(r'^books/(\d+)/(/d+)/',views.book),
#正则里面()分组正则,会将分组中的正则匹配到的内容作为返回值返回
]
简单分子,伪代码
当用户请求的路径是它: /books/2019/8
url(r'^books/(\d+)/(\d+)',views.book),
上面路由做的事情:
re.match(^books/(\d+)/,/books/2019/)
2019和8作为位置参数交给了要执行的book视图函数
视图函数book的写法
def book(request,xx,oo):
xx = 2019
oo = 9
pass
```
- 视图views.py文件中函数的写法
#位置传参,url中正则^books/(\d+)/(\d+)/,那么第一个()分组匹配到的数据,作为book函数的第二个参数,第二个()分组匹配到的数据,作为book的第二个参数 def book(request,year,month): print('year',year,'month',month) #return HttpResponse('%s所有书籍'%year) return HttpResponse('%s年%s月所有书籍'%(year,month))
使用url路由系统时需要注意的几个点
```
1.urlpatterns中的元素按照书写顺序从上往下逐一匹配正则表达式,一旦匹配成功则不再继续。
2.若要从URL中捕获一个值,只需要在它周围放置一对圆括号(正则分组匹配)
3.不需要添加一个前导的反斜杠(也就是写在正则最前面的那个/),因为每个url,都有。例如,应该是^home/ 而不是^/home/。
4.每个正则表达式前面的r,是可选的但是建议加上
5.^home$ 以什么结尾,以什么开头,严格限制路径
```
有名分组路由
其实就是正则中的有名分组,看实例
- urls.py文件中的写法
urlpatterns = [ url(r'^admin/',admin.site.urls), url(r'^books/(?P<year>\d+)/(?P<month>\d+)/',views.book), #{'year':2020,'month':6},url将有名分组正则匹配出来的数据,交给了book视图函数作为关键字参数来使用 ] - views.py文件中函数的写法如下
#^books/(?P<year>\d+)/(?P<month>\d+)/ #获取到url中的有名分组正则匹配到的数据,那么函数形参名称必须和有名分组正则的那个名称相同才可以,也就是按照上面的url来看的话,函数的形参必须是year和month这个两个名称,并且关键字传参不需要考虑函数形参的位置。 def book(request,month,year): #print('year',year,'month',month) print(request.path) #/book/2020/6/ #return HttpResponse('%s所有书籍'%year) return HttpResponse("%s年%s月所有书籍"%(year,month))
补充说明
```
当用户通过浏览器访问django框架完整的项目中的某个路径时,如果用户在输入网址路径的最后,没有加上斜杠/,比如http://127.0.0.1:8000/test,那么django会先将用户输入的网址路径加上一个后置/,也就是将路径变成http://127.0.0.1:8000/test/,然后给浏览器发一个重定向的响应操作,状态码为301,那么浏览器拿到这个重定向操作之后,就会自动发起一个这样的路径请求http://127.0.0.1:8000/test/,所以当我们打开浏览器控制台的network功能查看请求过程时,会看到两个请求,一个有斜杠,一个没有。第二个有斜杠的才会走到我们的url.py文件中的路径配合和分发对应的视图的地方。
我们可以通过一个配置项,告诉django,不要自动加路径后面的斜杠了,但是需要注意的就是你自己写的url中的正则,也别加后面的斜杠,不然正则匹配不到。
配置项直接写在settings配置文件中,任意位置
APPEND_SLASH = False #False表示告诉django,不加路径后面的斜杠,默认值是True
```
视图函数中指定默认值
- views.py文件
在路由没有匹配任何参数的时候,num使用自己的默认值 在路由中有分组匹配数据的动作,比如url(r'^test/(\d+)/',views.test),用户输入网址http://127.0.0.1:8000/test/22/,那么22就匹配到了,会作为参数传给我们的test函数,那么num的值就变成了22 def test(request,num=10): print('number>>>',num) return HttpResponse('test') - urls.py文件
urlpatterns = [ url(r'^test/(\d+)/',views.test), ]
django学习第一天---MVC和MTV框架,request对象的属性,url路由系统的更多相关文章
- web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例
Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...
- day56——http协议、MVC和MTV框架模式、django下载安装、url路由分发
day56 昨日复习 今日内容 HTTP协议 网页:https://www.cnblogs.com/clschao/articles/9230431.html 老师整理的重点 老师整理的重点 请求信息 ...
- 自定义mvc或mtv框架:基于wsgiref的web框架
把mvc或mtv框架的model数据库,view:html,control逻辑处理,url判别,wsgiref集中在一个文件 代码如下 #!/usr/bin/env python #-*- codin ...
- day 66 Django基础二之URL路由系统
Django基础二之URL路由系统 本节目录 一 URL配置 二 正则表达式详解 三 分组命名匹配 四 命名URL(别名)和URL反向解析 五 命名空间模式 一 URL配置 Django 1.11 ...
- day 53 Django基础二之URL路由系统
Django基础二之URL路由系统 本节目录 一 URL配置 二 正则表达式详解 三 分组命名匹配 四 命名URL(别名)和URL反向解析 五 命名空间模式 一 URL配置 Django 1.11 ...
- python django基础二URL路由系统
URL配置 基本格式 from django.conf.urls import url #循环urlpatterns,找到对应的函数执行,匹配上一个路径就找到对应的函数执行,就不再往下循环了,并给函数 ...
- python MVC、MTV 框架介绍 Django 模板系统常用语法
Django 框架简介一.MVC框架和MTV框架1.MVC 全名Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分.优势: 耦合性低 重用性高 生命 ...
- Django (学习第一部 基础操作)
django 1 django 文件相关信息 2 Python创建django 3 命令行创建django 4 Django 必会三板斧 5 静态文件配置 6 request对象方法 7 pychar ...
- Django学习:url路由系统
一.MTV模型 1.Django的MTV分别代表: Model(模型):和数据库相关的,负责业务对象与数据库的对象(ORM) Template(模板):放所有的html文件 模板语法:目的是将白变量( ...
- Django 学习之用户认证组件auth与User对象
一.auth模块 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个. 1 .authenticate() ...
随机推荐
- Chrome浏览器不同版本兼容性的验证方法
Chrome浏览器不同版本兼容性的验证方法 背景 上周客户现场有出现使用国产信创设备上面的奇安信浏览器出现兼容性的问题. 开发认为是测试不全面导致. 认为测试应该必须测试过特定浏览器才可以进行说明. ...
- [转帖]【JVM】JDK命令行工具
在JDK/bin目录下我发现了许多命令行工具 这些命令有哪些作用呢,接下来我就来详细介绍一下 常用JDK命令行工具 命令名称 全称 用途 jstat JVM Statistics Monitoring ...
- [专题]中立遭质疑,提价遭反对,ARM的生存难题怎么破?
中立遭质疑,提价遭反对,ARM的生存难题怎么破? https://news.cnblogs.com/n/669715/ ARM税要提高.. RISC-V的机会? 文/黎文婕 来源:锌刻度(ID:znk ...
- 01显示转换隐私转换 有8个值转为false 显示转换Number的注意点
prompt()函数会弹出一个框,接受用户的输入.但是在实际的开发中.这样的操作是很少. 至少在我做开发的过程中没有使用过.我二没有看见人家在过开发的使用使用. console.log(Number( ...
- DevToys(开发工具) v1.0.2.1
从事开发工作的朋友们千万不要错过了!今天为大家带来的这款软件可以说是开发人员的必备工具,它就是DevToys软件!DevToys中包含了许多强大实用的开发工具,能够帮助用户将程序开发变得更加简单大大降 ...
- tp、laravel 伪静态配置
一.Apache下的伪静态配置 <IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews RewriteEngine On ...
- Python 潮流周刊第 38 期(摘要)+赠书5本
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- DBSAT脚本快速收集方法
DBSAT是Oracle官方提供的脚本,用于数据库的安全评估检查,用户可以放心下载使用. 下载链接具体参见MOS: Oracle Database Security Assessment Tool ( ...
- 使用KVM创建OEL虚拟机
在Linux工作站上使用KVM创建虚拟机. 首先说下我的需求: 1.其他LAN内的笔记本也可以连接到这些KVM的虚拟机,因此需要配置使用桥接网络 2.创建一个虚拟机,采用最小化安装系统,作为基础模版, ...
- Oracle 19c RAC 自动应用RU补丁简明版
环境:Oracle RAC(GI 19.3 + DB 19.3) 本文应用补丁信息, 19.16 RU: p34130714_190000_Linux-x86-64.zip 本文主要演示使用opatc ...