零基础小白必看篇:从0到1构建Python Web框架

python常用Web框架介绍 特点:高层次的Python Web框架,鼓励快速开发和简洁的设计。优点:自带ORM、强大的管理后台、用户认证系统、自动生成的管理界面等。适用场景:适用于需要快速开发、拥有丰富功能和需要强大后端管理的项目。在models.pyFastAPI 是一个高性能、易于使用且功能强大的 Web 框架,适用于从小型项目到大型高并发应用的开发。通过使用 Python 的类型提示和现代异步编程技术,FastAPI 提供了一个高效且开发者友好的环境,使得开发、测试和部署 Web 应用变得更加简洁和高效。 阅读详情

造轮子是最好的一种学习方式,本文尝试从0开始造个Python Web框架的轮子,我称它为ToyWebF。

本文操作环境为:MacOS,文中涉及的命令,请根据自己的系统进行替换。

ToyWebF的简单特性:

  • 1.支持多种不同形式的路由注册方式

  • 2.支持静态HTML、CSS、JavaScript

  • 3.支持自定义错误

  • 4.支持中间件

下面我们来实现这些特性。

 

最简单的web服务

首先,我们需要安装gunicorn,回忆一下Flask框架,该框架有内置的Web服务器,但不稳定,所以上线时通常会替换成uWSGI或gunicorn,这里不搞这个内置Web服务,直接使用gunicorn。

这里多说一句,小编是一名python开发工程师,这里有我自己整理的一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以关注小编,并在后台私信小编即可领取。

我们创建新的目录与Python虚拟环境,在该虚拟环境中安装gunicorn


 

 

mkdir ToyWebF python3 -m venv venv # 创建虚拟环境 source venv/bin/activate #激活虚拟环境 pip install gunicorn 复制代码

在啥都没有的情况下,构建最简单的Web服务,在ToyWebF目录下,创建app.py与api.py文件,写入下面代码。


 

 

# api.py 文件 class API: def __call__(self, environ, start_response): response_body = b"Hello, World!" status = "200 OK" start_response(status, headers=[]) return iter([response_body]) # app.py 文件 from api import API app = API() 复制代码

运行gunicorn app:app访问http://127.0.0.1:8000,可以看见Hello, World!,但现在请求体中的参数在environ变量中,难以解析,我们返回的response也是bytes形式。

 

 

 

我们可以使用webob库,将environ中的数据转为Request对象,将需要返回的数据转为Response对象,处理起来更加直观方便,直接通过pip安装一下。


 

 

pip install webob 复制代码

然后修改一下API类的__call__方法,代码如下。


 

 

from webob import Request, Response class API(object): def wsgi_app(self, environ, start_response): """通过 webob 将请求的环境信息转为request对象""" request = Request(environ) response = self.handle_request(request) return response(environ, start_response) def __call__(self, environ, start_response): self.wsgi_app(environ, start_response) 复制代码

上述代码中,通过webob库的Request类将environ对象(请求的环境信息)转为容易处理的request,随后调用handle_request方法对request进行处理,处理的结果,通过response对象返回。

handle_request方法在ToyWebF中非常重要,它会匹配出某个路由对应的处理方法,然后调用该方法处理请求并将处理的结果返回,在解析handle_request前,需要先讨论路由注册实现,代码如下。


 

 

class API(object): def __init__(self): # url路由 self.routes = {} def route(self, path): # 添加路由的装饰器 def wrapper(handler): self.add_route(path, handler) return handler return wrapper def add_route(self, path, handler): # 相同路径不可重复添加 assert path not in self.routes, "Such route already exists" self.routes[path] = handler 复制代码

其实就是将路由和方法存到self.routes字典中,可以通过route装饰器的形式将路由和方法关联,也可以通过add_route方法关联,在app.py中使用一下。


 

 

app = API() # 通过装饰器关联路由和方法 @app.route("/home") def home(request, response): response.text = "This is Home" # 路由中可以有变量,对应的方法也需要有对应的参数 @app.route("/hello/{name}") def hello(requst, response, name): response.text = f"Hello, {name}" # 可以装饰类 @app.route("/book") class BooksResource(object): def get(self, req, resp): resp.text = "Books Page" def handler1(req, resp): resp.text = "handler1" # 可以直接通过add_route方法添加 app.add_route("/handler1", handler1) 复制代码

因为url中可以存在变量,如@app.route("/hello/{name}"),所以在匹配时,需要进行解析,可以使用正则匹配的方式进行匹配,parse这个第三方库已经帮我们实现了相应的正则匹配逻辑,pip安装使用一下则可。


 

 

# pip install parse In [1]: from parse import parse # 匹配 In [2]: res = parse("/hello/{name}", "/hello/二两") In [3]: res.named Out[3]: {'name': '二两'} 复制代码

这里定义find_handler方法来实现对self.routes的遍历。


 

 

class API(object): def find_handler(self, request_path): # 遍历路由 for path, handler in self.routes.items(): # 正则匹配路由 parse_result = parse(path, request_path) if parse_result is not None: # 返回路由对应的方法和路由本身 return handler, parse_result.named return None, None 复制代码

了解了路由与方法关联的原理后,就可以实现handle_request方法,该方法主要的路径就是根据路由调度对应的方法,代码如下。


 

 

import inspect class API(object): def handle_request(self, request): """请求调度""" response = Response() handler, kwargs = self.find_handler(request.path) try: if handler is not None: if inspect.isclass(handler): # 如果是类,则获取其中的方法 handler = getattr(handler(), request.method.lower(), None) if handler is None: # 类中该方法不存在,则该类不支持该请求类型 raise AttributeError("Method now allowed", request.method) handler(request, response, **kwargs) else: # 返回默认错误 self.defalut_response(response) except Exception as e: raise e return response 复制代码

在该方法中,首先实例化webob库的Response对象,然后通过self.find_handler方法获取此次请求路由对应的方法和对应的参数,比如。


 

 

@app.route("/hello/{name}") def hello(requst, response, name): response.text = f"Hello, {name}" 复制代码

它将返回hello方法对象和name参数,如果是/hello/二两,那么name就是二两。

因为route装饰器可能装饰器的类对象,比如。


 

 

# 可以装饰类 @app.route("/book") class BooksResource(object): def get(self, req, resp): resp.text = "Books Page" 复制代码

此时self.find_handler方法返回的hanler就是个类,但我们希望调用的是类中的get、post、delete等方法,所以需要一个简单的判断逻辑,通过inspect.isclass方法判断handler如果是类对象,那么就通过getattr方法获取类对象实例的中对应的请求方法。


 

 

# 获取请求方法, request.method.lower() 可为 get、post、delete handler = getattr(handler(), request.method.lower(), None) 复制代码

如果类对象中没有该方法属性,则抛出该请求类型不被允许的错误,如果不是类对象或类对象中存在该方法属性,则直接调用则可。

此外,如果方法的路由并没有注册到self.routes中,即404的情况,定义了defalut_response方法返回其中内容,代码如下。


 

 

class API(object): def defalut_response(self, response): response.status_code = 404 response.text = "Not Found" 复制代码

如果handle_request方法中调度的过程出现问题,则直接raise将错误抛出。

至此,一个最简单的web服务就编写完成了。

 

支持静态文件

回顾Flask,Flask可以支持HTML、CSS、JavaScript等静态文件,利用模板语言,可以构建出简单但美观的Web应用,我们让TopWebF也支持这一功能,最终实现图中的网站,完美兼容静态文件。

 

 

Flask使用了jinja2作为其html模板引擎,ToyWebF同样使用jinja2,jinja2其实实现一种简单的DSL(领域内语言),让我们可以在HTML中通过特殊的语法改变HTML的结构,该项目非常值得研究学习。

首先pip install jinja2,然后就可以使用它了,在ToyWebF项目目录中创建templates目录,以该目录作为默认的HTML文件根目录,代码如下。


 

 

from jinja2 import Environment, FileSystemLoader class API(object): def __init__(self, templates_dir="templates"): # html文件夹 self.templates_env = Environment(loader=FileSystemLoader(os.path.abspath(self.templates_dir))) def template(self, template_name, context=None): """返回模板内容""" if context is None: context = {} return self.templates_env.get_template(template_name).render(**context) 复制代码

首先利用jinja2的FileSystemLoader类将file system中的某个文件夹作为loader,然后初始化Environment。

在使用的过程中(即调用template方法),通过get_template方法获得具体的某个模板并通过render方法将对应的内容传递给模板中的变量。

这里我们不写前端代码,直接去互联网中下载模板,这里下载了Bootstrap提供的免费模板,可以自行去https://startbootstrap.com/themes/freelancer/下载,下载完后,你会获得index.html以及对应的css、jss、img等文件,将index.html移动到ToyWebF/templates中并简单修改了一下,添加一些变量。


 

 

<!-- Masthead Heading--> <h1 class="masthead-heading text-uppercase mb-0">{{ title }}</h1> <!-- Masthead Subheading--> <p class="masthead-subheading font-weight-light mb-0">你好呀-{{ name }}</p> 复制代码

然后在app.py文件中为index.html定义路由以及需要的参数。


 

 

@app.route("/index") def index(req, resp): template = app.template("index.html", context={"name": "二两", "title": "ToyWebF"}) # resp.body需要bytes,template方法返回的是unicode string,所以需要编码 resp.body = template.encode() 复制代码

至此html文件的支持就完成了,但此时的html无法正常载入css和js,导致页面布局非常丑陋且交互无法使用。

接着就让ToyWebF支持css、js,首先在ToyWebF目录下创建static文件夹用于存放css、js或img等静态文件,随后直接将前面下载的模板,其中的静态文件复制到static中则可。

通过whitenoise第三方库,可以通过简单的几行代码让web框架支持css和js,不需要依赖nginx等服务,首先pip install whitenoise,随后修改API类的__init__方法,代码如下。


 

 

class API(object): def __init__(self, templates_dir="templates", static_dir="static"): # html文件夹 self.templates_env = Environment(loader=FileSystemLoader(os.path.abspath(self.templates_dir))) # css、JavaScript文件夹 self.whitenoise = WhiteNoise(self.wsgi_app, root=static_dir) 复制代码

其实就是通过WhiteNoise将self.wsgi_app方法包裹起来,在调用API的__call__方法时,直接调用self.whitenoise。


 

 

class API(object): def __call__(self, environ, start_response): return self.whitenoise(environ, start_response) 复制代码

此时,如果请求web服务获取css、js等静态资源,WhiteNoise会获取其内容并返回给client,它在背后会匹配静态资源在系统中对应的文件并将其读取返回。

至此,一开始的网页效果就实现好了。

 

自定义错误

web服务如果出现500时,默认会返回internal server error,这显得比较丑,为了让框架使用者可以自定义500时返回的错误,需要添加一些代码。

首先API初始化时,初始self.exception_handler对象并定义对应的方法添加自定义的错误


 

 

class API(object): def __init__(self, templates_dir="templates", static_dir="static"): # 自定义错误 self.exception_handler = None def add_exception_handler(self, exception_handler): # 添加自定义error handler self.exception_handler = exception_handler 复制代码

在handler_request方法进行请求调度时,调度的方法执行逻辑时报500,此时不再默认将错误抛出,而是先判断是否有自定义错误处理。


 

 

class API(object): def handle_request(self, request): """请求调度""" try: # ...省略 except Exception as e: # 为空,才返回internal server error if self.exception_handler is None: raise e else: # 自定义错误返回形式 self.exception_handler(request, response, e) return response 复制代码

在app.py中,自定义错误返回方法,如下。


 

 

def custom_exception_handler(request, response, exception_cls): response.text = "Oops! Something went wrong." # 自定义错误 app.add_exception_handler(custom_exception_handler) 复制代码

custom_exception_handler方法只返回自定义的一段话,你完全可以替换成美观的template。

我们可以实验性定义一个路由来看效果。


 

 

@app.route("/error") def exception_throwing_handler(request, response): raise AssertionError("This handler should not be user") 复制代码

 

支持中间件

Web服务的中间件也可以理解成钩子,即在请求前可以对请求做一些处理或者返回Response前对Response做一下处理。

为了支持中间件,在TopWebF目录下创建middleware.py文件,在编写代码前,思考一下如何实现?

回顾一下现在请求的调度逻辑。

1.通过routes装饰器关联路由和方法 2.通过API.whitenoise处理 3.如果是请求API接口,那么会将参数传递给API.wsgi_app 4.API.wsgi_app最终会调用API.handle_request方法获取路由对应的方法并调用该方法执行相应的逻辑

如果希望在request前以及response后做相应的操作,那么其实就需要让逻辑在API.handle_request前后执行,看一下代码。


 

 

from webob import Request class Middleware(object): def __init__(self, app): self.app = app # API类实例 def add(self, middleware_cls): # 实例化Middleware对象,包裹self.app self.app = middleware_cls(self.app) def process_request(self, req): # request前要做的处理 pass def process_response(self, req, resp): # response后要做的处理 pass def handle_request(self, request): self.process_request(request) response = self.app.handle_request(request) self.process_response(request, response) return response def __call__(self, environ, start_response): request = Request(environ) response = self.app.handle_request(request) return response(environ, start_response) 复制代码

其中add方法会实例化Middleware对象,该对象会将当前的API类实例包裹起来。

 

 

 

Middleware.handle_request方法其实就是在self.app.handle_request前调用self.process_request方法处理request前的数据以及调用self.process_response处理response后的数据,而核心的调度逻辑,依旧交由API.handle_request方法进行处理。

这里的代码可能会让人感到疑惑,__call__方法和handle_request方法中都有self.app.handle_request(request),但其调用对象似乎不同?这个问题暂时放一下,先继续完善代码,然后再回来解释。

接着在api.py中为API创建middleware属性以及添加新中间件的方法。


 

 

class API(object): def __init__(self, templates_dir="templates", static_dir="static"): # 请求中间件,将api对象传入 self.middleware = Middleware(self) def add_middleware(self, middleware_cls): # 添加中间件 self.middleware.add(middleware_cls) 复制代码

随后,在app.py中,自定义一个简单的中间件,然后调用add_middleware方法将其添加。


 

 

class SimpleCustomMiddleware(Middleware): def process_request(self, req): print("处理request", req.url) def process_response(self, req, resp): print("处理response", req.url) app.add_middleware(SimpleCustomMiddleware) 复制代码

定义好中间件后,在请求调度时,就需要使用中间件,为了兼容静态文件的情况,需要对css、js、ing文件的请求路径做一下兼容,在其路径中加上/static前缀


 

 

<!--修改index.html中导入静态文件的路径,只需要简单的加上/static前缀则可。--> <!--修改css导入路径,加/static前缀,img与js的导入路径同样需要--> <link href="/static/css/styles.css" rel="stylesheet" /> <img class="masthead-avatar mb-5" src="/static/assets/img/avataaars.svg" alt="" /> <script src="/static/js/scripts.js"></script> 复制代码

紧接着,修改API的__call__,兼容中间件和静态文件,代码如下。


 

 

class API(object): def __call__(self, environ, start_response): path_info = environ["PATH_INFO"] static = "/" + self.static_dir # 以 /static 开头 或 中间件为空 if path_info.startswith(static) or not self.middleware: # "/static/index.css" -> 只取 /index.css, /static开头只是用于判断 environ["PATH_INFO"] = path_info[len(static):] return self.whitenoise(environ, start_response) return self.middleware(environ, start_response) 复制代码

至此,中间件的逻辑就完成了。

但代码中依旧有疑惑,Middleware类中的__call__方法和handle_request方法其调用的self.app到底是谁?

为了方便理解,这里一步步拆解。

如果没有添加新的中间件,那么请求的调度逻辑如下。


 

 

# 属性映射关系 API.middleware = Middleware API.middleware.app = API # 调度逻辑 API.__call__ -> middleware.__call__ -> self.app.handle_request -> API.handle_request() 复制代码

在没有添加中间件的情况下,self.app其实就是API本身,所以middleware.__call__中的self.app.handle_request就是调用API.handle_request。

如果添加了新的中间件,如上述代码中添加了名为SimpleCustomMiddleware的中间件,此时的请求调度逻辑如下。


 

 

# 属性映射关系 API.middleware = Middleware API.middleware.app = API API.middleware.add(SimpleCustomMiddleware) API.middleware.app = SimpleCustomMiddleware API.middleware.app.app = api 相当于 API.middleware.SimpleCustomMiddleware.app = api # 调度逻辑 API.__call__ -> middleware.__call__ -> self.app.handle_request -> SimpleCustomMiddleware.handle_request() -> self.app.handle_request -> API.handle_request() 复制代码

因为注册中间件时,Middleware.add方法替换了原始Middleware实例中的app对象,将其替换成了SimpleCustomMiddleware,而SimpleCustomMiddleware也有app对象,SimpleCustomMiddleware中的app对象,才是API类实例。

在请求调度的过程中,就会触发Middleware类的handle_request方法,该方法就会执行中间件相应的逻辑去处理request和response中的数据。

当然,你可以通过Middleware.add方法添加多个中间件,这就会构成栈式调用的效果,代码如下。


 

 

class SimpleCustomMiddleware(Middleware): def process_request(self, req): print("处理request", req.url) def process_response(self, req, resp): print("处理response", req.url) class SimpleCustomMiddleware2(Middleware): def process_request(self, req): print("处理request2", req.url) def process_response(self, req, resp): print("处理response2", req.url) app.add_middleware(SimpleCustomMiddleware) app.add_middleware(SimpleCustomMiddleware2) 复制代码

启动web服务后,其执行效果如下。

 

 

本文章素材来源于网络,如有侵权请联系删除。

python web后端开发框架,python web前端开发框架 Django、Flask和Tornado。框架把构建Web应用的通用的代码进行了封装,把相应的模块组织起来,使用Web框架可以更轻松、快捷的创建web应用,不用去关注一些底层细节python学生作品。文末领取Python全套最新学习资源1、Django框架Django是基于Python的免费和开放源代码Web框架,它遵循模型-模板-视图(MTV)体系结构模式。它由Django Software Foundation(DSF)维护,这是一个由非营利组织成立的独立组织。 阅读详情

相关推荐

Python从0到100最全学习路线必看导航(上半篇1-50):零基础到全栈开发指南

Python从0到100最全学习路线》系列文章上半篇以50篇系统性教程构建了完整的Python技术生态图谱。本文作为该系列的导航总结,将深度解析文章体系架构,揭示从到的完整成长路径,帮助开发者建立清晰的学习框架。(注:本文仅覆盖1-50篇内容分析)新专栏订阅前200名享有9.9元优惠,破200订阅上涨至19.9。订阅此专栏,免费进粉丝福利群,解答所有问题,领取各种专属福利!

拥有百余位万粉技术博主、200余位可合作代发博主,私域技术社群规模达千人,商务合作私信 2万+

超详细!小白入门PythonWeb开发详解!

FastAPI 是 Python 开发的一个开源 Web 框架,几乎包括了 Web 应用的所有内容,可用于快速搭建高性能、优雅的网站应用。最主要的是,FastAPI 提供了 Web 开发经常使用到的模块,包括自动生成接口文档等,使开发者能够专注业务部分。

weixin_68789096的博客 1万+

LABVIEW学习之MODBUS-TCP通讯

LABVIEW学习之MODBUS-TCP通讯 1,MODBUS-TCP通讯介绍: MODBUS通讯是工业上面经常用到的一种通讯协议。该协议的原理及介绍不在此累述,下面直接介绍LABVIEW对此协议的应用。 2,MODBUS通讯所需的函数: 安装了DSC模块之后可以在数据通信内找到相关函数 3 ,主VI 主要思路就是使用状态机来进行连接 读取 写入 断开。使用枚举类型来选择状态: 1,连接 2,写入多个M继电器: 3,写入单个M继电器 4,写入双字节D...

风动9527的博客 2万+

Python Web开发(详细教程)

PythonWeb开发是使用Python语言进行Web应用程序开发的过程。Python是一种简洁、易读且功能强大的编程语言,因此在Web开发领域广受欢迎。PythonWeb开发可以涵盖多个方面,包括服务器端开发、数据库管理、前端设计和API开发等。在服务器端开发中,常用的Python Web框架有Django、Flask和Bottle等。这些框架提供了一套工具和结构,使得开发者能够更高效地构建Web应用程序。在PythonWeb开发中,数据库管理也是一个重要的方面。

m0_58477260的博客 7124

微信开放标签wx-open-launch-app样式失效?手把手教你正确设置点击区域(附完整代码)

本文详细解析了微信开放标签`wx-open-launch-app`样式失效和点击无响应的常见问题,提供了完整的解决方案和代码示例。通过分析标签内部实现机制,指导开发者正确设置点击区域和样式,确保跨平台兼容性和用户体验优化。

joy55的博客 320

conda环境的复制、备份操作

请确保将 source_env 替换为你要复制的现有环境的名称,并将 target_env 替换为你要创建的新环境的名称。要备份一个Conda虚拟环境,你需要将环境的配置信息和依赖包列表保存起来,以便在需要的时候能够重新创建相同的环境。要将现有的 conda 环境复制为其他环境,可以使用 conda create 命令并克隆已存在的环境。

Dollhan的博客 3772

【Python Web开发】Python Web开发知识全解析

Web 开发是指使用编程语言和技术构建基于浏览器的应用程序。Web 应用程序是用户通过网络浏览器访问的动态页面,它可以提供诸如登录、数据提交、交互等功能。前端:涉及到用户在浏览器中看到并与之交互的部分,主要由 HTML、CSS、JavaScript 等构建。后端:负责处理业务逻辑、数据库交互、安全性等,Python 作为后端语言非常适合处理这些复杂的任务。Python Web 开发因其简洁性、可扩展性和强大的框架生态系统,成为了现代 Web 开发的重要选择。

萧鼎的博客 5105

何恺明团队MeanFlow论文解读:单步生成模型如何实现ImageNet 256×256的SOTA效果?

何恺明团队提出的MeanFlow框架在生成式AI领域实现重大突破,通过引入平均速度场概念,在ImageNet 256×256数据集上达到单步生成3.43 FID的SOTA效果。该技术解决了传统Flow Matching方法的积分误差累积问题,显著提升生成效率与质量,为AI图像生成应用开辟新方向。

weixin_30687051的博客 398

用 Python 写一个简单的Web框架

一、概述 在Python中,WSGI(Web Server Gateway Interface)定义了Web服务器与Web应用(或Web框架)之间的标准接口。在WSGI的规范下,各种各样的Web服务器和Web框架都可以很好的交互。 由于WSGI的存在,用Python写一个简单的Web框架也变得非常容易。然而,同很多其他的强大软件一样,要实现一个功能丰富、健壮高效的Web框架并非易事;如果您打算...

python学习者的博客 1614

VSCode玩转STM32:手把手教你配置EIDE插件与OpenOCD调试(附野火DAP配置文件详解)

本文详细介绍了如何在VSCode中配置EIDE插件与OpenOCD进行STM32开发,特别针对野火DAP调试器提供了配置文件详解。从基础环境搭建到深度调试技巧,帮助开发者高效完成STM32项目开发,实现现代化嵌入式开发工作流。

weixin_26905487的博客 553

使用 CFD 仿真进行阀门性能分析:第一部分

了解如何使用 Ansys Discovery 评估阀门性能,使工程师能够设计出更好的产品。

jkh920184196的博客 3145

Python Web(十一)自建mini-web框架

web框架和web服务器的关系介绍前面已经学习过web服务器, 我们知道web服务器主要是接收用户的http请求,根据用户的请求返回不同的资源数据,但是之前我们开发的是静态web服务器,返回的都是静态资源数据,假如我们想要web服务器返回动态资源那么该如何进行处理呢?这里我们给大家介绍一个web框架,使用web框架专门负责处理用户的动态资源请求,这个web框架其实就是一个为web服务器提供服务的应用程序,简称web框架。

qq_45187774的博客 286

python爬虫 小白轻松从0到1_零基础小白必看篇:从0到1构建Python Web框架

造轮子是最好的一种学习方式,本文尝试从0开始造个Python Web框架的轮子,我称它为ToyWebF。本文操作环境为:MacOS,文中涉及的命令,请根据自己的系统进行替换。ToyWebF的简单特性:1.支持多种不同形式的路由注册方式2.支持静态HTML、CSS、JavaScript3.支持自定义错误4.支持中间件下面我们来实现这些特性。最简单的web服务首先,我们需要安装gunicorn,回忆一...

weixin_39684967的博客 108

【实战项目开发技术分享】机器人安全通过狭窄区域的方案

在机器人的应用领域中,有时会遇到需要机器人通过狭窄区域的情况。无论是室内还是室外,机器人需要具备适应性和灵活性,以便在狭窄的空间中进行安全、高效的导航。本文将提供一些如何让机器人通过狭窄区域的实现方案和思路,希望帮助读者可以根据实际的开发需要进行适当调整和扩展。

xiewf的博客 2万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

python web零基础入门_零基础小白必看篇:从0到1构建Python Web框架

造轮子是最好的一种学习方式,本文尝试从0开始造个PythonWeb框架的轮子,我称它为ToyWebF。本文操作环境为:MacOS,文中涉及的命令,请根据自己的系统进行替换。ToyWebF的简单特性:1.支持多种不同形式的路由注册方式2.支持静态HTML、CSS、JavaScript3.支持自定义错误4.支持中间件下面我们来实现这些特性。最简单的web服务首先,我们需要安装gunicorn,回忆一...

weixin_39739395的博客 264

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

从0到1构建Python Web框架

造轮子是最好的一种学习方式,本文尝试从0开始造个Python Web框架的轮子,我称它为ToyWebF。声明:本文参考Jahongir Rahmonov老哥的How to write a...

weixin_30230009的博客 254

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

从 0 到 1,用 Python 构建超实用 Web 实时聊天应用

通过本次实践,我们利用 Python 的 Flask 和 SocketIO 成功打造了一个 Web 实时聊天应用。从后端路由与消息处理,到前端界面交互和事件监听,每个环节紧密配合。这不仅加深了对 Web 开发中实时通信原理的理解,也展示了 Python 在网络编程和 Web 应用开发方面的强大能力。开发者可在此基础上,根据实际需求添加更多高级功能,如用户管理、加密传输等,进一步完善应用。TAGPython、Flask、SocketIO、Web 实时聊天、WebSocket、实时通信、Web 开发。

Tekin 是深耕技术 20 年的全栈实战派专家,精通 Go/Python/Java 等多语言开发。博客专注技术原理与实战结合,深度解析 Python 高阶编程、Go 语言架构、数据库优化等硬核内容。涵盖并发编程、机器学习、云原生等前沿领域,通过真实案例拆 1503

python web框架之flask框架

优点:其有世界上最大的社区和最多的包。它的文档十分完善,提供了一站式的解决方案,包括缓存、orm、管理后台、验证、表单处理等,使开发复杂的有数据库驱动的网站变得简单。缺点:其系统耦合度较高,替换内置功能比较麻烦,学习曲线陡峭。

qq_57443706的博客 2930

Mesop Python Web框架终极指南:用纯Python构建现代化Web应用

Mesop是一个革命性的Python Web框架,让你无需编写JavaScript、CSS或HTML,就能快速构建现代化Web应用。作为Google内部快速应用开发的首选工具,Mesop将Python的简洁优雅与Web开发的强大功能完美结合,为开发者提供了前所未有的开发体验。无论你是UI新手还是经验丰富的开发者,Mesop都能让你在几分钟内创建出功能完整的Web应用。 ## 为什么选择Mesop

gitblog_00158的博客 1086

python web开发框架有哪些,python web前端开发框架

优 点:Web2py 是一个用 Python 语言编写的免费的开源 Web 框架,旨在敏捷快速的开发 Web 应用,具有快速、可扩展、安全以及可移植的数据库驱动的应用,遵循 LGPLv3 开源协议。Web2py 提供一站式的解决方案,整个开发过程都可以在浏览器上进行,提供了 Web 版的在线开发,HTML 模版编写,静态文件的上传,数据库的编写的功能。优 点:Starlette 是一个轻量级的 ASGI 框架 / 工具包,非常适合构建性能异步服务,它是生产就绪的,并为您提供以下内容:令人印象深刻的表现。

2301_81895949的博客 3896

38个基于Python的Web 开发框架

Web 开发是Python 应用中重要的一部分,下面总结了38个基于Python的Web 开发框架!其中有的历史悠久,有的发展迅速,还有的已经停止维护,大家可以根据情况参考学习。

m0_58477260的博客 4141

python web开发框架有哪些,python web开发框架 简单

大家好,给大家分享一下python web开发框架第三方库有哪些,很多人还不知道这一点。下面详细解释一下。现在让我们来看看!Bobo是一个轻量级的框架,用来创建WSGI web应用。它的目标是简单易用,容易记忆python皮卡丘代码复制粘贴。它强调两个方面的内容:注意:Bobo并不具备模板语言、数据库集成层或是其他一些WSGI中间件或特定应用程序库所提供的功能。Bobo建立在其他框架之上,尤其是WSGI和WebOb。 官方教程主页为:Introduction — bobo 2.2.0 documentati

2301_81895949的博客 1262

使用Python的web框架tornado快速搭建简单网页

Tornado的简单搭建一个web端hi,handsome boy 1.Python的主流web开发框架: 1.Django框架 2.Flask框架 3.Tornado框架 2.Tornado框架结构 该框架图来自b站up主:Python编程语言 3.Tornado的基本框架代码介绍 1.导入对应的Tornado的库 from tornado import web,ioloop,httpserver 2.路由系统的构建 from tornado import web,ioloop,httpse

K_AAbb的博客 1183

python web开发框架对比,python的web框架有哪些

大家好,小编来为大家解答以下问题,python web框架主要的三大基本框架,python web开发框架对比,现在让我们一起来看看吧!Source code download: 本文相关源码大家好,小编来为大家解答以下问题,python web开发框架有哪些,python web开发框架对比,现在让我们一起来看看吧!Bobo是一个轻量级的框架,用来创建WSGI web应用。它的目标是简单易用,容易记忆python爱心代码英文python自动化运维应用。它强调两个方面的内容:注意:Bobo并不具备模板语言、

pingf123的博客 957
上一篇: 用python处理excel文件有多轻松?工作从未如此简单
下一篇: 奇怪?我的 Python 代码里面出现了薛定谔的 Bug
python阿喵
博客等级 码龄6年 169粉丝 127原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值