第一章(二):Django框架的模式、路由、视图

提示:欢迎查阅python之Django框架,如有疑问,欢迎评论,一定回复!!!


前言

提示:这里系本文要记录的大概内容:

Python语言提供了创建web应用的相当全面的框架:Django。掌握好Django框架,会加深对前后端的关系的理解,更是在工作当中的一把利剑。本文,将呈现Django的模式、路由系统、视图,并结合实例展示基础效果。


提示:以下是本篇文章正文内容,如有疑问,欢迎评论中指出,定在一周内予以回复。

一、web框架的模式

web框架的模式一般分为两种:MVC模式、MTV模式

web框架模式概述
MVC模式模型(M):负责业务对象与数据库的对象(ORM);视图(V):负责与用户的交互(页面)(即:一个个html文件);控制器(C):接收用户的输入,调用模型视图,完成用户的请求;
MTV模式Model(模型):负责业务对象与数据库的对象(ORM);Template(模板):负责如何把页面展示给用户(一个个html文件),View(试图):负责业务逻辑,并在恰当的时候调用Model和Template

Django框架的模式属于MTV模式。
在这里插入图片描述

二、Django的路由系统(URLS)

2.1.路由系统的基本配置

from django.contrib import admin
from django.urls import path
# 上面默认导入了admin、path
# 下面引入应用app的视图
from blog import views

urlpatterns = [
    path('admin/', admin.site.urls),#默认的路由:admin后台管理系统的URL规则。
    path('index/', views.index, name='index'), #path(路由, 视图函数, 别名);
]

⚠️释义
在django的项目中urls.py文件,存在一个名称“urlpatterns”列表,其元素都是**path()**对应一条路由规则。格式:

path(路由,视图函数,别名)

2.2.路由分发(或:路由包含)include()

from django.contrib import admin
from django.urls import path, include # 加上导入 include
from blog import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/', views.index, name='index'), #path(路由, 视图函数, 别名);
    path('', include('app2.urls')), # django项目中添加了应用app2,app2要创建一个url.py文件
]

⚠️提示:路由包含,简化项目代码复杂度。场景:项目中,应用越来越多,路由就会逐渐复杂。此时,使用include(),简化其复杂度。

路由包含的使用规则:

  1. 项目的应用app中创建一个url.py文件(属于应用app自身的路由配置);
  2. 项目url.py总的路由文件中,导入include;
  3. 项目url.py中urlpatterns列表中path的格式:

path(‘部分url/’, include(‘应用名.urls’))⚠️提示:这里的"部分url/",可以为空,一般写应用app的名称

2.3.路由参数如何解析?

⚠️疑问:不同的用户访问一个网站,url都是带动态参数的。不可能每个url都是预先定好的。

Django项目的URLS如何带参数呢?

2.3.1.基本的带参数的路由格式

path(’ 部分url / <参数数据类型:参数名称>/', 视图函数,别名),
⚠️注意:符号< >里面就是-->类型:参数名称。
⚠️示例:path('userinfo/<int:id>/', views.userinfo, name='userinfo'),

  • app2应用中的urls.py文件中:
from django.urls import path
from app2 import views

urlpatterns = [
    …………,
    path('show_userinfo/<int:id>/', views.show_userinfo, name='show_userinfo'),
]
  • app2应用中views.py文件中,添加视图函数:
def show_userinfo(request, id ):
    return HttpResponse('app2中的用户,我的id是' + str(id))

⚠️总结:urls.py文件中,路由的带参数<int:id>,在views.py中的视图函数show_userinfo是带相同名称的参数--->id;

URL参数类型一共4种类型,见下表。

参数数据类型说明
str任意非空字符串,不包含“/”,默认类型
int匹配0和正整数
slug匹配任何ASCII字符、连接符和下划线
uuid匹配一个UUID格式的字符串,该对象必须包含“-”,所有字母必须小写。如:520e346f-b229-415f-90a7-d4f0d5b0f585 。⚠️注意:uuid线上随机生成:https://www.uuid.online/

2.3.2.复杂的参数情况下,使用 re_path() 方法正则匹配

路由中的正则表达式的语法格式如下:

(?P< name >pattern)
⚠️释义:name是匹配的参数名称,pattern是匹配的模式。
⚠️示例:'page/(?P< page>\d+)&key=(?P< key>\w+)/' :接收page/开头后面跟任意位数整数&key=字母、数字和下划线的路由。如:page/50&key=na_me/ 这个url就可访问该路由。

正则表达式说明
.匹配任意单个字符
\d匹配任意一个数字
\w匹配字母、数字、下划线
*匹配0个或者多个字符(如:“\d*”代表匹配0个或者多个数字)
[a-z]匹配a~z中任意一个小写字符
{1,5}匹配1~5个字符

2.4.反向解析路由:path() 中的别名的作用–》比如:前端按钮跳转到某个页面

  • path()里面的name=别名,为了避免冲突,建议使用:应用名_视图函数名
  • 有了name参数后,可以在视图函数或者模版的html文件中调用它。

根据name得到路由配置的中URL地址,被称作“反向解析路由”。这样的好处是:只有name不变,URL地址可以随意改变。

from django.urls import path, re_path
from app2 import views

urlpatterns = [
	……,
    path('url_reverse/', views.index, name='app2_index'),
]
  • 在view.py中,添加名为index的视图函数:

⚠️:在view.py视图函数中,使用:reverse()函数可以反向解析路由。

reverse(别名)

from django.shortcuts import render, reverse
def index(request):
    '''
    使用reverse()方法反向解析
    :param request:
    :return:
    '''
    print("在views()函数中使用reverse()方法解析的结果:"+reverse("app2_index"))
    return render(request, 'index.html')

⚠️:在templates模版的html文件中,可以反向解析路由。

{% url 别名 %}

<head>
    <meta charset="UTF-8">
    <title>反向解析{% url 'app2_index' %}</title>
</head>
<body>
    {% url 'app2_index' %}
</body>

2.5.示例:正则表达式、反向解析路由的示例

  • ⚠️在django项目中的app2应用中的urls.py文件中添加子路由:
from django.urls import path, re_path
from app2 import views

urlpatterns = [
    re_path('page/(?P<page>\d+)&key=(?P<key>\w+)/', views.page),#正则,注意这里的<>里面的参数名一定要与view.py中视图函数中的形参一致。
    path('url_reverse/', views.index, name='app2_index'),#反向代理
]
  • ⚠️同样,在django项目中的app2应用中的view.py文件中添加视图函数:
from django.http import HttpResponse
from django.shortcuts import render, reverse

def page(request,page,key):
    return HttpResponse('app2中page函数,参数page是{},key是{}'.format(page, key))


def index(request):
    '''
    使用reverse()方法反向解析
    :param request:
    :return:
    '''
    print("在views()函数中使用reverse()方法解析的结果:"+reverse("app2_index"))
    return render(request, 'index.html')
  • ⚠️Templates中的html文件以第4点为例。
    python manage.py runserver 运行项目。下面是访问url的截图。
    提示:这里对正则表达式路由的匹配示例:
    在这里插入图片描述
    提示:这里对反向路由解析的示例:
    在这里插入图片描述
    前端跳转某一页面的举例

三、Django的视图函数(VIEWS)

提示:Django的视图函数,MTV模式中的View层,用于处理客户端的请求并生成响应数据。
视图函数的基本样式:

from django.shortcuts import render,HttpResponse

def index(request):
    return HttpResponse('hello,django!!!')

⚠️提示:浏览器向服务端请求一个页面时,Django先创建一个HttpRequest对象(该对象包含请求的元数据),然后加载相应视图函数,并将该HttpRequest对象传给第一个参数(request)。视图函数最后return一个HttpResponse对象。

3.1.HttpRequest对象

属性/方法含义
path字符串,表示请求页面的路径,不包含域名
method字符串,表示页面的请求方法,常用值包括“GET”和“POST”,必须使用大写方式
encoding字符串,表示提交的数据的编码方式。一般默认为UTF-8编码方式
GET字典类型,包含GET请求方法中的所有参数
POST字典类型,包含POST请求方法中的所有参数
FILES字典类型,包含上传文件的信息
COOKIES字典类型,包含所有的Cookies对象
session字典类型,表示当前的会话
META字典类型,包含所有的HTTP头部信息,如HTTP_USER_AGENT(客户端Agent信息)、REMOTE_ADDR(客户端的IP地址)等
user表示当前登录的用户

3.2.HttpResponse对象

⚠️提示:视图函数返给HttpResponse对象,该对象包含返给客户端的所有数据。

属性含义
content返回的内容
status_code返回的HTTP响应状态码
content-type返回的数据的MIME类型,默认为text/html

3.2.1.常见的状态码status_code

状态码含义
200状态成功
301永久重定向,Location属性的值为当前URL
302临时重定向,Location属性的值为新的URL
404URL未发现,不存在
500内部服务器错误
502网关错误
503服务不可用

3.3.视图函数-两个对象的示例

提示:这里两个对象:请求、响应,即:3.1、3.2 说介绍的两个对象。
app2的views.py文件的视图函数:

from django.http import HttpResponse
from django.shortcuts import render
# test_get、test_post 验证获取request对象的属性;
def test_get(request):
	‘’‘获取request对象各种属性值’‘’
    print(request.GET, '/n')
    print(request.GET.get('username'), '/n')
    print(request.get_host(), '/n')
    print(request.get_full_path_info(), '/n')
    print(request.path, '/n')
    print(request.get_full_path(), '/n')
    print(request.method, '/n')
    print(request.META, '/n')
    return HttpResponse('')

def test_post(request):
    print(request.method, '/n')
    print(request.POST.get('username'), '/n')
    return render(request, 'index.html')
    
# 验证response对象的属性
def test_response(request):
    response = HttpResponse()
    response.write('hello django')# 写入content
    response.write("<br>")
    response.write(response.content)#获取content属性
    response.write("<br>")
    response.write(response['Content-type'])# 类型
    response.write("<br>")
    response.write(response.status_code)# 响应码
    response.write("<br>")
    response.write(response.charset)# 编码
    response.write("<br>")
    return response

截图展示上面脚本在控制台的输出:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冷凝娇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值