Python Web django
文章目录
- Python Web django
- django
- 特点
- MVC 与 MTV模型
- MVC 模型
- MTV 模型
- 安装
- 创建项目
- 运行
- 编辑器运行
- 命令行运行
- 目录结构
- project和app
- 请求参数获取
- request
- 在请求方法的request参数后增加参数
- Path
- 路由模式
django
jango 是一个由 Python 编写的一个开放源代码的 Web 应用框架。
Django 是一个高级的 Python Web 框架,用于快速开发可维护和可扩展的 Web 应用程序。
使用 Django,只要很少的代码,Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容,并进一步开发出全功能的 Web 服务。
Django 本身基于 MVC 模型,即 Model(模型)+ View(视图)+ Controller(控制器)设计模式,MVC 模式使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。
MVC 优势:
- 分离关注点:
- 模型(Model): 负责应用程序的数据和业务逻辑。通过将数据和逻辑从用户界面分离出来,使得模型可以独立于用户界面进行测试和修改。
- 视图(View): 负责显示用户界面,但通常没有直接访问应用程序的数据。这使得可以更容易地更改应用程序的外观而不影响数据处理。
- 控制器(Controller): 处理用户输入、更新模型和调整视图。通过将用户输入和应用程序逻辑分离,可以更容易地更改用户界面的交互方式而不影响数据和业务逻辑。
- 可维护性:
- 分离关注点使得每个组件都可以独立开发、测试和维护。这种分离降低了代码的耦合性,使得在一个组件中的修改不太可能导致对其他组件的影响。
- 可扩展性:
- 由于每个组件都是相对独立的,因此可以更容易地添加新功能或进行修改,而不会影响应用程序的其他部分。
- 可重用性:
- 模型、视图和控制器之间的分离允许在不同的上下文中重用这些组件。例如,可以更换视图以改变应用程序的外观,而不影响其余的结构。
- 可测试性:
- 模型、视图和控制器的分离使得单元测试更加容易。可以分别测试每个组件,确保其功能正确,而无需整个应用程序的上下文。
- 团队协作:
- 因为MVC模式清晰地定义了各个组件的角色和责任,所以在团队协作中更容易分工协作,不同开发人员可以专注于不同部分的开发。
Python 加 Django 是快速开发、设计、部署网站的最佳组合。
特点
- ORM(对象关系映射): Django 提供了一个强大的 ORM,允许开发者通过 Python 代码来定义和操作数据库模型,而无需直接使用 SQL。这使得数据库操作更加抽象和易于管理。
- MVC 架构: Django 遵循 MVC(模型-视图-控制器)的软件设计模式,但它使用了稍微不同的术语。在 Django 中,模型(Model)表示数据结构,视图(View)负责呈现用户界面,而控制器(Controller)的职责被称为视图(View)。
- 模板引擎: Django 使用模板引擎来生成 HTML,这使得前端和后端的代码分离更加容易。Django 的模板语言允许开发者在模板中嵌入动态内容。
- 自动化 admin 界面: Django 自动生成管理后台,使得管理和操作数据库的过程变得非常简单。开发者可以轻松地创建、修改和删除数据库记录,而无需编写自定义的管理界面。
- 表单处理: Django 提供了强大的表单处理工具,使得用户输入的验证和处理变得更加简单。这对于开发 Web 表单和处理用户提交的数据非常有用。
- 安全性: Django 内置了一些安全性功能,例如防止常见的 Web 攻击(如 CSRF 攻击),并提供了方便的用户身份验证和授权系统。
- 可扩展性: Django 的组件是松耦合的,允许开发者使用现有的组件或编写自己的应用程序来扩展框架功能。
- 社区支持: Django 拥有庞大的社区支持,提供了大量的文档、教程和第三方包,使得学习和使用 Django 变得更加容易。
MVC 与 MTV模型
MVC 模型
MVC 模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。
MVC 以一种插件式的、松耦合的方式连接在一起。
- 模型(M)- 编写程序应有的功能,负责业务对象与数据库的映射(ORM)。
- 视图(V)- 图形界面,负责与用户的交互(页面)。
- 控制器(C)- 负责转发请求,对请求进行处理。
简易图:
用户操作流程图:
MTV 模型
Django 的 MTV 模式本质上和 MVC 是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django 的 MTV 分别是指:
- M 表示模型(Model):编写程序应有的功能,负责业务对象与数据库的映射(ORM)。
- T 表示模板 (Template):负责如何把页面(html)展示给用户。
- V 表示视图(View):负责业务逻辑,并在适当时候调用 Model和 Template。
除了以上三层之外,还需要一个 URL 分发器,它的作用是将一个个 URL 的页面请求分发给不同的 View 处理,View 再调用相应的 Model 和 Template,MTV 的响应模式如下所示:
简易图:
用户操作流程图:
解析:
用户通过浏览器向我们的服务器发起一个请求(request),这个请求会去访问视图函数:
- a.如果不涉及到数据调用,那么这个时候视图函数直接返回一个模板也就是一个网页给用户。
- b.如果涉及到数据调用,那么视图函数调用模型,模型去数据库查找数据,然后逐级返回。
视图函数把返回的数据填充到模板中空格,最后返回网页给用户。
安装
pip install Django
创建项目
运行
编辑器运行
命令行运行
python manage.py runserver <ip:port>
# 其中ip默认时127.0.0.1 port默认诶8000
目录结构
|--项目名称
|-- manage.py # 一个实用的命令行工具,可让你以各种方式与该 Django 项目进行交互,该内容一般不进行修改
|-- 项目名文件夹 # 项目容器
|-- __init__.py 空文件,告诉python是一个python包
|-- asgi.py # 一个 ASGI 兼容的 Web 服务器的入口,以便运行项目,包含环境设置
|-- setting.py # 该 Django 项目的设置/配置。
|-- urls.py # 该 Django 项目的 URL 声明; 一份由 Django 驱动的网站"目录"。定义了项目中所有url对应的视图
|-- wsgi.py 一个 WSGI 兼容的 Web 服务器的入口,以便运行你的项目
|-- templates 统一存放试图的文件夹
project和app
创建方式1
项目为project,在一个项目中为了方便管理,可以将不同的模块分为不同的app,实现代码的管理,可以通过
manage.py startapp dept
在views.py中定义请求,请求第一个参数必须是request,request为默认绑定的参数
from django.shortcuts import render
# Create your views here.
from django.http import HttpResponse
def list(request):
return HttpResponse('这是部门管理')
urls。py定义请求地址
path('dept',dept.views.list)
访问:http://localhost:8000/dept
来创建,
可以通过package来创建包,将请求处理放在该包中
定义userview.py
from django.http import HttpRequest,HttpResponse
def list(request):
request.GET.get('id')
return HttpResponse('您好中国')
*urls.py中定义用户的请求路径
path('user', list)
请求参数获取
request
可以通过request.GET.get()方式来获取get请求的请求参数
同时在request中包含有POST,可以通过request.GET/POST来获取get请求携带的请求参数(url后?传递的参数)
在请求方法的request参数后增加参数
在request后增加参数,可以获取resful风格请求的请求参数
# userId,userName的参数名称必须和resful风格中的参数<>中的路径变量名称一致
def userInfo(request, userId, userName):
return HttpResponse(f"用户id:{userId},用户名:{userName}")
path("userinfo/<userId>/<userName>",user.userview.userInfo)
# resful风格的请求<user_Id> == {id}(spring中的resful风格请求)
Path
def _path(route, view, kwargs=None, name=None, Pattern=None):
from django.views import View
if kwargs is not None and not isinstance(kwargs, dict):
raise TypeError(
f"kwargs argument must be a dict, but got {kwargs.__class__.__name__}."
)
if isinstance(view, (list, tuple)):
# For include(...) processing.
pattern = Pattern(route, is_endpoint=False)
urlconf_module, app_name, namespace = view
return URLResolver(
pattern,
urlconf_module,
kwargs,
app_name=app_name,
namespace=namespace,
)
elif callable(view):
pattern = Pattern(route, name=name, is_endpoint=True)
return URLPattern(pattern, view, kwargs, name)
elif isinstance(view, View):
view_cls_name = view.__class__.__name__
raise TypeError(
f"view must be a callable, pass {view_cls_name}.as_view(), not "
f"{view_cls_name}()."
)
else:
raise TypeError(
"view must be a callable or a list/tuple in the case of include()."
)
- router 请求路径,所有请求进入到urls.py中,循环遍历urlpatterns集合(List)中的path,如果router路由匹配成功,则找到对应的View进行试图渲染
- view 视图
- kwargs 参数 参数类型为dict字典,kwargs的参数可以通过在请求方法上添加参数的方式来获取对应的数据
def userInfo(request, userId, userName, id):
print(id)
return HttpResponse(f"用户id:{userId},用户名:{userName}")
path("userinfo/<userId>/<userName>",user.userview.userInfo, kwargs={"id":100})
- name 定义路由名称的,路由名称应该保持唯一,主要作用是进行路由反转(通过路由的名称获取路由的信息)
ef userInfo(request, userId, userName, id):
# 因为该请求是resful风格的请求,所有需要餐素
print(reverse("userinfo", kwargs={"userId":userId,"userName":userName}))
return HttpResponse(f"用户id:{userId},用户名:{userName}")
路由模式
在 Python 的 Django 框架中,path
函数用于定义 URL 路由模式(Pattern),这些模式指定了如何匹配请求的 URL 并将其分发到相应的视图函数。每个 path
函数调用都会创建一个 Path
对象,该对象封装了路由模式、视图函数以及可选的名称和关键字参数(kwargs
)。
这里的“Pattern”通常指的是 URL 路由模式字符串,它定义了 URL 的结构。路由模式可以包含静态部分和动态部分。静态部分是 URL 中不变的部分,而动态部分则使用尖括号(< >
)括起来,并指定参数的类型,如整数(int
)、字符串(str
,默认类型,可以省略类型声明)、UUID 等。
例如,以下是一个简单的 URL 路由模式:
from django.urls import path
from . import views
urlpatterns = [
path('articles/<int:year>/<int:month>/', views.article_detail, name='article_detail'),
]
在这个例子中:
'articles/<int:year>/<int:month>/'
是路由模式。articles/
是静态部分。<int:year>
和<int:month>
是动态部分,分别表示年份和月份,并且它们都是整数类型。
当 Django 接收到一个匹配这个模式的 URL 请求时,它会从 URL 中提取 year
和 month
的值,并将它们作为参数传递给 views.article_detail
视图函数。
除了整数类型,Django 还支持其他类型的动态 URL 参数,如:
- int(整型)
str
(或省略类型声明,默认为字符串)slug
(一个特定的字符串格式,通常用于表示文章的简短描述性 URL,通常包含-或_)uuid
(用于表示唯一标识符)path
(用于匹配任何不包含/
的字符串)
可以通过指定类型来确保从 URL 中提取的参数符合预期的格式。如果请求的 URL 不匹配指定的类型,Django 将返回一个 404 错误。
在定义路由模式时,还可以使用正则表达式来创建更复杂的匹配规则,但这通常是通过 re_path
函数(在 Django 2.0 之前称为 url
函数)来实现的,而不是 path
函数。re_path
允许你使用正则表达式来定义 URL 模式,提供了更大的灵活性。然而,对于大多数简单的用例,path
函数提供的便捷性和可读性通常就足够了。