提示:欢迎查阅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(),简化其复杂度。
路由包含的使用规则:
- 项目的应用app中创建一个url.py文件(属于应用app自身的路由配置);
- 项目url.py总的路由文件中,导入include;
- 项目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 |
404 | URL未发现,不存在 |
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提供了大量能使我们快速便捷地处理数据的函数和方法。