Django初识
一.模板渲染JinJa2
1.下载jinja2
在cmd中输入命令: pip install jinja2
注意:如果不成功,查看是否设置环境变量
给python文件中的scripts文件路径设置环境变量
2.html中代码的书写
<h1>姓名:{{name}}</h1>
<h1>爱好:</h1>
<ul>
{% for hobby in hobby_list %}
<li>{{hobby}}</li>
{% endfor %}
</ul>
3.py文件中代码的书写
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)三层,他们之间以一种插件式的、松耦合的方式连接在一起,模型负责业务对象与数据库的映射(ORM),视图负责与用户的交互(页面),控制器接受用户的输入调用模型和视图完成用户的请求,其示意图如下所示:

MTV
Django的MTV模式本质上和MVC是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django的MTV分别是值:
-
M 代表模型(Model): 负责业务对象和数据库的关系映射(ORM)。
-
T 代表模板 (Template):负责如何把页面展示给用户(html)。
-
V 代表视图(View): 负责业务逻辑,并在适当时候调用Model和Template。
除了以上三层之外,还需要一个URL分发器,它的作用是将一个个URL的页面请求分发给不同的View处理,View再调用相应的Model和Template,MTV的响应模式如下所示:

一般是用户通过浏览器向我们的服务器发起一个请求(request),这个请求回去访问视图函数,(如果不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户),视图函数调用模型,模型去数据库查找数据,然后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。
三.在cmd中创建一个Django项目的步骤
先操作:
D: --->进入D盘
cd 文件夹 ---->进入对应的文件夹
然后:
1.创建一个名为'myjango'的Django项目
django-admin startproject myjango
2.在项目目录下创建应用
方法一:python manage.py startapp app1
方法二:django-admin manage.py startapp app2
3.注册app在setting文件中
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app1.apps.App02Config', #方法一
'app2', #方法二
]
四.基于Django实现一个简单的实例
1.url控制器
from app1 import views #找到app1应用下的views文件
urlpatterns = [
url(r'',views.login) #匹配正则为空,一打开连接就触发login函数
]
2.视图views
from django.shortcuts import render
# Create your views here.
def login(request): #Django已经编译好,直接通过render方法打开需要的资源
return render(request,'login.html',{'people':'小强'}) #也可直接以字典的形式传递参数
3.模板,在templates文件夹中建立的html文件
<div>哈哈</div>
<div>当前登录的用户是:{{ people }}</div>
<form>
用户名:<input type="text" name="username">
<input type="submit">
</form>
4.执行项目

五.Django基础之URL路由系统
1.URL配置的基本格式
from app1 import views
url_list=[
url(正则表达式,views视图函数,参数,别名)
]
参数说明
正则表达式:一个正则表达式字符串
views视图函数:一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
参数:可选的要传递给视图函数的默认参数(字典形式)
别名:一个可选的name参数
2.正则表达式详解
URL基本配置:
from app1 import views #导入view视图函数
urlpatterns = [ #若要在URL中匹配信息,则给对应的加()
url(r'^art/(\d{4})/$',views.articles_2003), #匹配年份4个数字
#注意:如果'匹配年份' 和 '匹配年份月份'在一起, 匹配年份在前,一般需要给最后加上'$',不 #然'匹配年份月份'的时候会被 '匹配年份'的给拦截
url(r'^art/(\d{4})/(\d{2})',views.articles) #匹配年份4个数字,月份2个数字
]
注意事项:
1. urlpatterns中的元素按照书写顺序从上往下逐一匹配正则表达式,一旦匹配成功则不再继续。
2. 若要从URL中捕获一个值,只需要在它周围放置一对圆括号(分组匹配)。
3. 不需要添加一个前导的反斜杠(也就是写在正则最前面的那个/),因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。
4.每个正则表达式前面的'r' 是可选的但是建议加上。
5. ^articles& 以什么结尾,以什么开头,严格限制路径
views视图:
from django.shortcuts import render,HttpResponse #导入HttpResponse '响应'方法
#request请求
#HttpResponse响应
def articles_2003(request,year):
return HttpResponse(year)
def articles(request,year,month): #如果在URL中没有给年份月份命名,那个就要注意书写顺序,
#不然顺序就会错乱
#例如:在URL获取的年份正常顺序为 2017 11
#未命名顺序写反获取的就是 11 2017
return HttpResponse(year+month)
3.分组命名匹配详解
URL内容:
from app1 import views
urlpatterns = [
url(r'^art/(?P<year>\d{4})/$', views.articles_2003),
url(r'^art/(?P<year>\d{4})/(?P<month>\d{2})', views.articles)
url(r'^art/', views.articles_2003) #从URL中什么都不回去,与'获取年份'调用views视图中同一个
] #函数方法,用户输入无年份则取默认值,有年份则获取年份
#从URL中获取内容,以及给相应正则内容命名规范: (?P<命名>正则内容)
views视图:
from django.shortcuts import render,HttpResponse
def articles_2003(request,year='2019'): #如果用户为输入年份,则取默认值
return HttpResponse(year)
def articles(request,month,year): #URL中给相应正则命名之后,这块就不用担心顺序不对,导致接收参数
#内容不对的问题了
return HttpResponse(year+month)
4.include '应用'中的URL (也叫URL(路由)分发)
(1)总的URL下的内容:
urlpatterns = [
url(r'^app1/',include('app1.urls'))
]
#注意:此时的正则后面不能写'$',不然就匹配不到app1路径后面的内容了
#查找的时候也不能按照之前的路径输了-->例如:127.0.0.1:8888/art/2018/11
#应该改成 -->127.0.0.1:8888/app1/art/2018/11
(2)应用下的urls内容:(其实就是将之前的总URL内容复制,删改相应内容)
from app1 import views
urlpatterns=[
url(r'^art/(?P<year>\d{4})/(?P<month>\d{2})', views.articles)
]
(3)url传递额外的参数给视图函数:{'内容':'内容'},必须为字符串的格式
from app2 import views
urlpatterns = [
url(r'^art/(?P<year>\d{4})/$', views.articles_2003,{'foo':'时间'}),
url(r'^art', views.articles_2003,{'foo':'时间'})
]
#注意:此时app2对应的 views视图 函数接受参数内也应该加上'foo'
def articles_2003(request,foo,year='2019'):
return HttpResponse(foo+':'+year)

浙公网安备 33010602011771号