后端,我是认真的

news2024/11/14 20:38:36

web框架介绍

1. 什么是web框架

应该叫web应用框架(web application framework)是一种开发框架。
通俗点来说,就是用来开发web应用的程序。


2. 为什么要使用框架来开发

互联网行业流行一句话叫“不要重复造轮子”,特别是对于新手和应用层开发人员。对于web开发来说,要提高开发效率,我们需要站在前人的肩膀上,利用成熟的web框架,把精力放在业务逻辑的实现上,不关心底层建设。


本质上来讲就是一个字快。
开发一个软件项目好比盖房子:
方案一、

  • 生产砖块、木头、水泥、钢筋、
  • 打地基
  • 盖房子
  • 装修
  • 购置家具

方案二、

  • 找开发商买毛坯房
  • 装修
  • 购置家具
    方案三、
  • 找开发商购买精装修房子
  • 购置家具
    很显然如果所有的工作都从头做起的方案一的效率最低,而站在前人的肩膀上的方案4是效率最高的。从方案二开始就好比是封装了底层建设的框架,不同的框架的封装程度不同,自由度和开发效率各不同。

3. 如何选择框架

如何选择框架呢?
在这里插入图片描述
选择web框架好比买房子选择有实力的开发商。python最流行三大框架是Django,Flask,Tornado。

  • Django
    • 大而全
    • 入门简单
    • 开发效率极高
    • 最流行
    • 类似于方案三(精装修的房子)
  • Flask
    • 轻量级
    • 自由度高
    • 流行
    • 有一定难度
    • 类似于方案二(毛坯房)
  • Tornado
    • 轻量级
    • 自由度高
    • 异步
    • 难度较大
    • 应用在高并发的场景

如何选择框架要根据项目的用户量,需求变动频率,开发周期等综合考虑,一般有系统架构师来决定。

4. Django是什么?

Django是一个高级的Python Web框架,它的宗旨是:Django makes it easier to build better Web apps more quickly and with less code.
发音[dʒæŋɡəʊ]

  • 开发效率极高
  • 功能全面开箱即用
  • 安全放心
  • 社区活跃,插件丰富

因为django框架功能全面,可以看到web应用开发的全貌,学习难度也较低,推荐新手先学习。

python虚拟环境

在python项目开发过程中会下载很多第三方库,有时不同项目对同一个库的依赖版本不同,如果所有项目都使用同一个python环境就会起冲突不便于管理。


因此,实际开发中会为每一个项目都单独创建一个python的虚拟环境。这里的虚拟环境本质上是对系统python环境的一个拷贝,它依赖系统环境又和系统环境隔离。


流行的python虚拟环境管理工具有很多最常用的是virtualenv。

virtualenv

安装

首先要安装python3.8版本以及更高的版本
打开 cmd:

  • pip install virtualenv

创建虚拟环境

  • cd 到你想要创建虚拟环境的目录,然后运行下面的命令:cd Desktop

  • virtualenv env # env是虚拟环境的名字。如:virtualenv py3.9


运行完这个命令之后,会在当前目录下创建一个名为env的文件夹,这个文件中的内容就是环境的文件。
如果系统上有多个python环境可以通过-p参数指定不同python版本来创建对应的虚拟环境


使用虚拟环境

  • .\py3.9\Scripts\activate
  • 显示的包:pip list

注意

  1. 创建虚拟环境的目录路径中不能有中文和标点符号
  2. 进入虚拟环境后只在当前终端中有效,新开启的终端需要再次重新进入。如果关闭了终端会退出虚拟环境,再次进入的时候,需要重新进入虚拟环境。

退出虚拟环境

  1. 如果是切换,直接进入其他虚拟环境即可
  2. 主动退出当前虚拟环境
    运行命令:deactivate

![在这里插入图片描述](https://img-blog.csdnimg.cn/60a1862ad2804921afec41341ce14460.pn在这里插入图片描述

提示:
使用pycharm创建项目时会默认通过virtualenv在项目根目录下创建虚拟环境,点击terminal后会自动进入对应的虚拟环境。


创建Django项目

安装Django

进入虚拟环境中运行命令.\py3.9\Scripts\activate
然后需要安装django,进入虚拟环境中运行命令:pip install django==3.2.17 # 指定3.2的版本

创建项目

安装django后,会安装一个django-admin程序,用来创建和管理django项目。
要创建一个django项目可以运行如下命令:

  • django-admin startproject mingcheng_name project_path
    • 其中startproject是创建子命令,mingcheng_name是项目名必须提供,project_path是创建项目的路径,如果省略会把项目创建在当前目录下。

> 例如运行命令:
> 	study_django/								# 项目根目录,目录名可以随意更换
> 	  manage.py									# 管理django项目命令行工具
>     study_django/								# 项目目录,python包,
>         __init__.py							# 起始文件
>         settings.py           				# 项目配置文件
>         urls.py								# 项目根路由文件
>         asgi.py								# 兼容asgi协议的web服务器入口文件
>         wsgi.py								# 兼容wsgi协议的web服务器入口文件

但是这样项目根目录文件名和项目目录名相同,有时候我们不需要创建最外层的目录,只把项目生成在当前目录下可以运行如下命令:

  • django-admin startproject study_project . # 路径参数是. 代表当前目录

运行项目

在项目根目录下运行如下命令:

  • python manage.py runserver ip:端口
  • 命令不带ip和端口服务将默认运行在127.0.0.1:8000
  • 运行成功后在浏览器访问http://127.0.0.1:8000/将会看到欢迎页面。

注意
这只是一个Django 自带的用于开发的简易服务器,它为开发而设计,不要应用在生产环境中。


修改时区和语言

上一步中的欢迎页面看起来是英文的,django框架做了国际化,我们只需要在settings.py中修改如下配置

  • LANGUAGE_CODE = ‘zh-hans’
  • TIME_ZONE = ‘Asia/Shanghai’

即可配置中文和正确的时区。


使用pycharm创建Django

在这里插入图片描述


在这里插入图片描述


安装:pip install django==3.2.17
创建:django-admin startproject ck15_django .
打开:.\manage.py runserver


修改时区和语言

上一步中的欢迎页面看起来是英文的,django框架做了国际化,我们只需要在settings.py中修改如下配置

  • LANGUAGE_CODE = 'zh-hans'
  • TIME_ZONE = 'Asia/Shanghai'
    在这里插入图片描述

即可配置中文和正确的时区。


创建django应用

什么是应用

在Django中有项目和应用的概念。每一个应用都是一个 Python 包,并且遵循着相同的约定和结构。Django 自带一个工具,可以帮你生成应用的基础目录结构,这样你就能专心写代码,而不是创建目录了。

项目和应用有什么区别?

应用是一个专门做某件事的网络应用程序——比如博客系统,或者公共记录的数据库,或者小型的投票程序。 项目则是一个网站使用的配置和应用的集合。项目可以包含很多个应用。应用可以被很多个项目使用。

提示

也可以简单理解为一个项目即是一个网站,一个应用就是这个网站的某一个功能板块。

创建应用

在项目根目录下运行如下命令:

  • python manage.py startapp crm

这将会创建一个 crm 目录,它的目录结构大致如下:

crm/
    __init__.py
    admin.py              # django后台站点配置入口
    apps.py               # 应用信息配置入口
    migrations/           # 数据库迁移历史信息目录
        __init__.py
    models.py             # 数据模型模块
    tests.py              # 单元测试
    views.py              # 应用视图模块

这个目录结构包括了crm应用的全部内容。


第一个视图

打开crm/views.py,编写如下代码:

from django.shortcuts import render
from django.http.response import HttpResponse
# Create your views here.


def index(request):
    return HttpResponse('这是首页面')

在这里插入图片描述
这是 Django 中最简单的视图。如果想要看见效果,需要将一个url映射到它。


添加路由

在crm目录下创建子路由模块urls.py,编写如下代码:

from django.urls import path

from .views import index

urlpatterns = [
    path('index/', index),
]

在这里插入图片描述


再到主路由模块study_django/urls.py中添加子路由如下:

from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('crm/',include('crm.urls'))
]

在这里插入图片描述


做完上面的操作之后,重新运行服务,就可以通过urlhttp://127.0.0.1:8000/crm/访问在上面一步创建的视图。

在这里插入图片描述


django中的路由系统

django中路由的作用和路由器类似,当一个用户请求Django站点的一个页面时,是路由系统通过对url的路径部分进行匹配,一旦匹配成功就导入并执行对应的视图来返回响应。

django如何处理请求

  1. 当一个请求来到时,django首先到项目中查找根URLconf模块,在其中查找路由匹配规则。
  2. 根URLconf模块,就是项目文件目录下的urls.py文件。在这个文件中定义了一个变量urlpatterns。它是一个列表,其中每一个元素都是一个url模式,定义了url和视图函数的对应关系。
  3. django按顺序运行每个url模式,并在与请求的url匹配的第一个模式停止。
  4. 一旦去中一个url模式匹配,django将导入并调用该视图。
  5. 如果没有匹配的模式,或者在此过程中任何时候引发异常,django调用错误处理视图。

在这里插入图片描述


路由模块

在django中路由模块一般命名为url.py
每一个路由模块中都会包含一个urlpatterns变量,它是一个django.urls.path()或者django.urls.re_path()实例的列表。

在这里插入图片描述


根路由模块

最外层的路由模块,路由解析的入口。
django通过设置ROOT_URLCONF来确定主路由模块,通常是项目目录下的urls.py模块。

子路由

主路由包含的其他路由都是子路由。
一般都是各自应用目录下的urls.py模块。

path()

  • path(route,view, kwargs=None,name=None)
  • path函数返回一个对象,表示一个路由规则
  • route:一个字符串,表示url规则
  • view: 一个视图
  • kwargs:一个字典,需要传入的额外参数
  • name:url的命名

案例:
上一节,我们在crm应用中定义了如下路由:
path('index/', views.index)
'index/'和视图views.index进行映射。


include()

  • include(module, namespace=None)
  • 将一个子路由导入到一个URLconf模块中
  • module: URLconf模块(或模块名称)

案例:
上一节,我们在根路由中,通过include包含了crm子路由:
path('crm/', include('crm.urls'))
crm/和子路由crm.urls进行映射。


URLconf在什么上查找

  • 请求的url会被看做是一个普通的Python字符串,URLconf在其上查找并匹配。
  • 进行匹配时不包含GETPOST请求方式的参数以及域名。
  • 例如,https://www.example.com/myapp/ 请求中,URLconf 将查找 myapp/
  • https://www.example.com/myapp/?page=3 请求中,URLconf 仍将查找 myapp/
  • URLconf不检查使用哪种请求方法。
  • 换句话说,所有请求方法,对同一个URL无论是POST请求,GET请求等等,都将路由到相同的视图函数。

案例:
所以在浏览器中访问地址http://127.0.0.1/crm/index/时,URLconf将查找crm/index/
第一步在跟路由中进行匹配,可以匹配到:

  • path(‘crm/’, include(‘crm.urls’))

第二步当遇到include()时,它会将匹配到该点的URL部分cmr/切掉,并将剩余字符串index/发送到包含的crm.urls模块中进一步匹配

第三/index在crm.urls路由中可以匹配到:

  • path(‘index/’, views.index)

没有下一步匹配,直接执行对应的视图函数views.index

注意,这个过程会递归的进行,中间遇到任何一条匹配的路由就会返回。


在URL中捕获参数

django允许在url中捕获值,若要从URL中捕获值,请使用尖括号。
尖括号定义变量名,捕获的值传递给视图函数相同名称的参数。格式如下:

  • ‘<参数名>’

案例:
写一个学生详情接口,通过crm/students/n/返回id为n的学生的信息。
视图代码:

# crm/views.py
def detail(request, pk):
    return HttpResponse('学生id为{}的详情'.format(pk))		# 模拟返回对应学生的详情

在这里插入图片描述


路由代码:

from django.urls import path, re_path

# 这是一个约定的变量名,不能改
from . import views

urlpatterns = [
    path('index/', views.index),
    path('students/<int:pk>', views.students_002),
]

在这里插入图片描述


现在,在浏览器中访问:http://127.0.0.1:8000/crm/students/2/会返回页面:
在这里插入图片描述

注意看路由部分的<pk>,这里的pk对应视图函数的pk形参。django会自动匹配url中这部分的字符串2然后传递给detail函数的pk形参。


路径转换器

上面的案例有个漏洞,如果我们在浏览器中输入http://127.0.0.1:8000/crm/students/aaa/,我们发现它依然可以访问。

在实际开发中,这显然不对,id不可能是个字符串。当然可以在view中进行类型转换,但是不够通用。django中设计了路径转换器,能够在路由匹配时,自动进行转换。

以下路径转换器在默认情况下是可用的:

  • str: 匹配除了路径分隔符/之外的任何非空字符串。如果表达式中不包含转换器,默认为字符串转换器。

  • int: 匹配0或任何整数。返回一个整数类型

  • slug: 匹配任何由ASCII字符或数字组成的slug字符串,加上连字符和下划线。

  • uuid: 匹配格式化的UUID。为了防止多个url映射到同一个页面,必须包含破折号并且必须是小写字母。例如:075194d3-6885-417e-a8a8-6c931e272f00

  • path: 匹配任何非空字符串,包括路径分隔符/。这允许匹配完整的URL路径,而不是像str那样仅匹配url路径部分。


路径转换器的使用方式非常简单,只需要在捕获符号<>中,以以下语法即可:

我们可以将上面的案例修改为:

  • path('students/<int:pk>/', views.detail)

然后,我们再次访问`http://127.0.0.1:8000/crm/students/aaa/,结果是404。

当然,我们也可以捕获多个值,看如下案例:
视图代码:

# crm/views.py
def student_003(request, month, year):
    return HttpResponse(f'{year}{month}月报名的学生的列表')

路由代码:

# crm/urls.py
urlpatterns = [
    ...
    path('students/<int:year>-<int:month>/', views.student_003),
]

那么通过urlhttp://127.0.0.1:8000/crm/students/2022/01http://127.0.0.1:8000/crm/students/2022-01/会得到相同的结果。
在这里插入图片描述

但是如果访问http://127.0.0.1:8000/crm/students/9527-100/也会得到结果:

在这里插入图片描述

这显然又是bug。
路径转换器只能进行简单的类型转换和匹配,还需要更强大的匹配功能,需要用到re_path()函数。

re_path()

  • re_path(route,view, kwargs=None,name=None)函数返回一个对象,表示一条路由规则。
  • route: 一个字符串,表示一个url规则
  • view:一个视图
  • kwargs: 一个字典,需要传入的额外参数
  • name: url命名

path()不同的是,route部分包含正则表达式。
当进行匹配时,从正则表达式中捕获的组会被传递到视图中。
如果组是命名的,则作为命名参数,否则作为位置参数。值以字符串的形式专递,不进行任何类型转换。
命名正则表达式分组的语法是:(?P<name>pattern),其中name是组的名称,pattern是要匹配的某个模式。

下面是前面例子中的路由,使用正则表达式重写:

urlpatterns = [
    re_path(r'students/(?P<year>\d{4})/(?P<month>0[1-9]|[1-9]|1[0-2])/', views.student_003),
]

这样写和之前的路由匹配一致,只是:

  • 匹配的url会受到限制,例如:100月将不再匹配,因为月份整数被限制为1-12。
  • 捕获的每个参数都以字符串的形式发送到视图。
  • 当从使用path()切换到re_path()或相反时,特别重要的是注意视图参数的类型会发生变化,因此可能需要调整视图。

使用没有命名分组的正则表达式

除了命名组语法,例如(?P<year>\d{4}),还可以使用较短的未命名组,例如(\d{4})。这种写法并不特别推荐,因为它更容易在匹配的预期含义和视图参数之间意外的一如错误。

注意在实际使用中建议只使用一种,要么命名,要么不命名,因为当两种方式混合使用时,会忽略未命名的组,只将命名的组传递给视图函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/351290.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TLP5754的代替品SLM343兼容光耦的单通道隔离驱动 应用解决方法

TLP5754的代替品SLM343兼容光耦的单通道隔离驱动应用解决方法是一种光兼容的单通道隔离MOSFET、IGBT具有不同驱动电流能力的栅极驱动器&#xff0c;以及UVLO电压电平。峰值输出电流为4.0A。主要特点和特点带来显著的性能和可靠性。性能亮点包括高共模瞬态抗扰度&#xff08;CMT…

给 “rm” 命令添加个“回收站”,再也不用担心误删文件了!

1.rm命令解析 rm命令可以删除一个目录中的一个或多个文件或目录&#xff0c;也可以将某个目录及其下属的所有文件及其子目录均删除掉。对于链接文件&#xff0c;只是删除整个链接文件&#xff0c;而原有文件保持不变。 注意&#xff1a;使用rm命令要格外小心。因为一旦删除了…

WebSocket内存马之tomcat-websocket源码实现(内存马系列篇七)

写在前面 这篇主要是分析一下WebSocket协议在Tomcat容器中的源码实现&#xff0c;方便大家在后面能够更好的了解下一篇Websocket型内存马的原理。 这个也是内存马系列第七篇 Websocket 什么是websocket&#xff1f; 首先来了解一下什么是websocket WebSocket全双工通信协…

2023-2-16 刷题情况

神经网络 题目背景 人工神经网络&#xff08;Artificial Neural Network&#xff09;是一种新兴的具有自我学习能力的计算系统&#xff0c;在模式识别、函数逼近及贷款风险评估等诸多领域有广泛的应用。对神经网络的研究一直是当今的热门方向&#xff0c;兰兰同学在自学了一本…

Airtest自动化测试工具介绍

官方网站&#xff1a;http://airtest.netease.com/ Airtest IDE&#xff1a; 跨平台的UI自动化测试编辑器&#xff0c;适用于游戏和App&#xff0c;详细参见官网文档&#xff1a;http://airtest.netease.com/docs/cn/index.html 这是Airtest测试工具标配的IDE&#xff0c;目…

Eclipse插件安装全方式介绍(优化版)

Eclipse插件安装方式 Eclipse插件安装有很多种方式&#xff0c;常见的有以下四种&#xff1a; [在线安装] -使用插件地址安装[在线安装] - 通过插件市场查找插件安装[离线安装]- 下载插件文件后复制文件Eclipse目录[离线安装]- 外部引用 本篇以安装Eclipse Tomcat插件为例进…

#8排序算法#

1.排序 1概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起 来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经过排…

AWS攻略——使用ACL限制访问

文章目录确定出口IP修改ACL修改主网络ACL修改入站规则修改子网ACL创建子网ACL新增入站规则新增出站规则关联子网假如我们希望限制只有公司内部的IP可以SSH登录到EC2&#xff0c;则可以考虑使用ACL来实现。 我们延续使用《AWS攻略——创建VPC》的案例&#xff0c;在它的基础上做…

Spring 系列 - AOP

Spring 系列 - AOP Spring 框架从使用到现在已经有相当的长的一段时间了&#xff0c;但总是在使用的时候&#xff0c;感觉一直停留在表面&#xff0c;对框架的底层了解的并不多&#xff0c;最近一段时间&#xff0c;打算好好折腾一下 Spring 的底层&#xff0c;想对 Spring 有…

智能家居项目(二)之工厂模式的实现

目录 一、举例说明&#xff1a;把下面的代码转换成工厂模式的方式来实现 二、用工厂模式的方式来实现 1、创建三个函数的文件 2、创建一个 Animal.h文件&#xff0c;把上述三个函数名都放在这个文件中 3、创建一个main主函数文件 4、用工厂模式创建的文件浏览 一、举例说…

用主动游泳的三维水母模型量化美杜莎的(medusan)机械空间的性能(三)(2017)

文章目录用主动游泳的三维水母模型量化美杜莎的&#xff08;medusan&#xff09;机械空间的性能&#xff08;三&#xff09;(2017)原文链接&#xff1a;https://doi.org/10.1017/jfm.2017.34. 讨论小结用主动游泳的三维水母模型量化美杜莎的&#xff08;medusan&#xff09;机械…

iptables防火墙详解

目录iptables防火墙iptables简介iptables表filter(过滤表)nat(网络地址转换表)mangle(修改表)raw(原始表)security 表处理目标REJECT(拒绝)DNAT(目的网络地址转换)SNAT(源网络地址转换)MASQUERADE(伪装)LOGREDIRECT报文处理流程规则表之间的优先顺序报文规则匹配管理防火墙规则…

单调栈---神奇的栈

我们平时用的栈多&#xff0c;但是我们一般用的是什么呢&#xff1f;用来做有效的括号匹配&#xff1f;还是用来记录我们的二叉树的节点&#xff1f; 通过对栈的理解&#xff0c;我们学习一个新的概念–单调栈。所谓单调栈&#xff0c;就是单调递增或者单调递减的栈。 那么单…

第四届宁波网安市赛初赛

由于赛后官方不给wp&#xff08;绿盟一向如此&#xff09;&#xff0c;交流群也没有得到其他题解&#xff0c;赛后就根据自己的wp来写了&#xff0c;wp由队友及我共同完成。比赛共解答10题&#xff0c;Web 5道&#xff0c;Misc 2道&#xff0c;Crypto 3道&#xff0c;wp只有一部…

深度学习算法面试常问问题(一)

博主秋招遇到的面试问题以及整理其他面经相关问题&#xff0c;无偿分享~ 项目叙述&#xff1a; 算法需求及应用场景算法的调研和初步方案的制定数据的准备&#xff08;包括数据标注和数据增强&#xff09;算法的介绍&#xff08;包括输入和输出&#xff0c;loss、backbone、训…

做外贸,你不能不懂的外贸流程知识

报关是履行海关进出境手续的必要环节之一&#xff0c;涉及两大类:进出境运输工具、物品和货物。由于性质不同&#xff0c;报关手续也有些不同。今天我就为大家详细介绍一下进出口报关的流程&#xff0c;包括出口货物报关的流程&#xff0c;随报关单提交的运费和商业单据&#x…

Spark中cache、persist、checkpoint三者的比较

原文链接&#xff1a;https://blog.csdn.net/AnameJL/article/details/124362219&#xff0c;再次主要是为了方便查找&#xff0c;把原文章复制一遍 目录 1. 三者的使用 1.1 cache的讲解与使用 1.2 persist的讲解与使用 1.3checkpoint 的讲解与使用 2. 三者的比较 2.1 优…

基于Web的智慧能源可视化管理系统

自工业革命开始&#xff0c;全球能源消耗持续增长&#xff0c;由碳循环体系破坏引发的全球变暖、海平面上升等问题严重影响着人类的可持续发展。得益于数字孪生、物联网、5G、AI识别等技术的不断成熟&#xff0c;以“大数据能源监控、精细化能源管理”为核心的智慧能源解决方案…

【电子学会】2022年12月图形化三级 -- 绘制雷达

绘制雷达 1. 准备工作 &#xff08;1&#xff09;绘制黑色背景&#xff1b; &#xff08;2&#xff09;删除默认角色小猫&#xff0c;添加角色Pencil。 2. 功能实现 &#xff08;1&#xff09;画笔的颜色设为黄色&#xff0c;Pencil的中心点设在笔尖位置&#xff0c;画笔的…

在Java 中 利用Milo通信库,实现OPCUA客户端,并生成证书

程序结构&#xff1a; 配置文件resources&#xff1a; opcua.properties 西门子PLC端口号为4840&#xff0c;kepserver为49320 #opcua服务端配置参数 #opcua.server.endpoint.urlopc.tcp://192.168.2.102:49320 opcua.server.endpoint.urlopc.tcp://192.168.2.11:4840 opcu…