当前位置: 首页 > news >正文

通过覆写 url_for 将 flask 应用部署到子目录下

0. 缘起

最近用 flask 写了一个 web 应用,需要部署到服务器上。而服务器主域名已经被使用了,只能给主域名加个子目录进行部署,比如主域名 example.org ,我需要在 example.org/flask 下部署。这时 flask 应用里的内部连接们就出现问题了,因为 flask 应用默认都是部署在根目录,比如项目的 css 定义在 /static/sytle.css 这个地址下,而部署到子目录 /flask 后,浏览器会去 /flask/static/style.css 找这个文件。怎么办?

查看源代码,发现 flask 的内部链接大都使用 url_for 函数实现的,那么解决方案就来了:修改这个函数,让它固定返回一个前缀。

1. 覆写 url_for() 函数测试一下

在 flask 项目目录下,新建一个 common.py 文件,内容如下:

from flask import current_appdef url_for(endpoint, **values):'''override flask.url_for() to add a prefix to the url'''return '/flask' + current_app.url_for(endpoint, **values)

然后到主程序(名叫 myapp.py)里面使用它,代替原来的 flask.url_for,测试代码如下:

from flask import Flask
from .common import url_forapp = Flask(__name__)@app.route("/hello")
def hello_world():return f"地址: {url_for('hello')}"

现在将程序跑起来看看,在命令行下输入:

flask --app myapp run --debug

在浏览器端访问地址 http://127.0.0.1:5000/hello,我们可以看到如下结果:
在这里插入图片描述
好了,第一步大功告成!

现在,我们只需要在各个模块中,将原先的 from flask import url_for 语句,统统替代为 from .common import url_for,就🆗了。

2. 在模板中使用新的 url_for

flask v3 默认使用 jinja2 模板,在其中可以直接使用 url_for 函数,来实现 url 相关的代码解耦。但是前述自定义 url_for 要如何才能在模板中生效呢?

经查询 flask 的官方文档,找到了一个修饰器 context_processor,说是在 jinja2 模板渲染前(即 render_template() 函数运行前),注册好自定义的模板处理函数。这个文档,说实在没看太明白。索性打开源代码看看。

用 vscode 打开项目虚拟环境中的源代码:

code venv\Lib\site-packages\flask

查找 context_processor,发现是在 def update_template_context(self, context: dict[str, t.Any]) -> None: 这个函数定义中处理 context_processor。但是这个函数体咱也看不懂呀,只好问问 kimi 了,结果人家果然将函数解析得明明白白。
![向 kimi 问函数语法](https://i-blog.csdnimg.cn/direct/22c3612787d640cfb80f079681a252d7.png#pic_center
向 kimi 问函数语法

kimi 的回答
最后我让 kimi 给我一个示例,这下就真的懂了。因此打开我的 myapp.py,加入如下代码:

@app.context_processor  # 这里是将自定义的 url_for 函数传递给 jinja2 模板
def inject_custom_url_for(): # 这个函数名不重要,任意均可return dict(url_for=url_for)

并修改 def hello_world(),加入模板测试一下:

@app.route("/hello")
def hello_world():from flask import render_template_stringreturn f"""本页地址: {url_for('hello')}  <br> 模板: {render_template_string("{{ url_for('static', filename='style.css') }}")}"""

运行起来之后,就可以看到模板内的地址果然也加上了前缀了。
在这里插入图片描述

3. 将前缀加入到配置中

现在,我们需要将前面硬编码的前缀,改为可以在部署之后随意修改的配置文件,以适应实际的部署场景。配置文件采用 flask 中最常见的 config.py。修改 common.py 如下:

from flask import current_appdef url_for(endpoint, **values):'''override flask.url_for() to add a prefix to the url'''prefix = current_app.config.get('URL_PREFIX', '')return prefix + current_app.url_for(endpoint, **values)

现在,我们随时可以修改部署在服务器端的 config.py 文件,加入如下配置,即可灵活修改网页服务器的子目录前缀了:

URL_PREFIX=/flask

至此,大功告成!

参考

  • Masked5,02_详解Flask中的URL ——url_for() 与 自定义动态路由过滤器: https://blog.csdn.net/Drifter_Galaxy/article/details/116106315
  • flask 之 url_for() 函数解析: https://blog.csdn.net/lovedingd/article/details/106671247
  • flask 3.0.x 官方文档: https://flask.palletsprojects.com/en/3.0.x/api/

相关文章:

通过覆写 url_for 将 flask 应用部署到子目录下

0. 缘起 最近用 flask 写了一个 web 应用&#xff0c;需要部署到服务器上。而服务器主域名已经被使用了&#xff0c;只能给主域名加个子目录进行部署&#xff0c;比如主域名 example.org &#xff0c;我需要在 example.org/flask 下部署。这时 flask 应用里的内部连接们就出现…...

攻防世界---->埃尔隆德32

做题笔记。 下载 查壳。 32ida 打开。 发现就一个判断。 跟进看看。 // 首次a20 int __cdecl sub_8048414(_BYTE *a1, int a2) {int result; // eaxswitch ( a2 ){case 0:if ( *a1 105 )goto LABEL_19;result 0;break;case 1:if ( *a1 101 ) // e…...

redis短信登录模型

基于Session实现登录 &#xff0c;...

【React】React18.2.0核心源码解读

前言 本文使用 React18.2.0 的源码&#xff0c;如果想回退到某一版本执行git checkout tags/v18.2.0即可。如果打开源码发现js文件报ts类型错误请看本人另一篇文章&#xff1a;VsCode查看React源码全是类型报错如何解决。 阅读源码的过程&#xff1a; 下载源码 观察 package…...

深度学习-目标检测(四)-Faster R-CNN

目录 一.模型框架 二&#xff1a;步骤详细 1.conv layers 2.RPN 3.anchors 4.cls layer分类 5.reg layer回归 6.Proprosal 7.Rol pooling 8.Classification 三.训练 1.训练RPN网络 2.全连接层部分训练&#xff1a; 都看到这里了&#xff0c;点个赞把&#xff01;&a…...

MATLAB中的无线通信系统设计有哪些最佳实践

在无线通信系统设计领域&#xff0c;MATLAB提供了一套强大的工具箱&#xff0c;使得系统设计、仿真、测试和分析变得更加高效和精确。本文将探讨MATLAB在无线通信系统设计中的最佳实践&#xff0c;包括信号处理、调制与解调、信道建模、误码率分析以及无线通信标准的实现。 1.…...

Java的发展史与前景

&#x1f308;个人主页&#xff1a;Yui_ &#x1f308;Linux专栏&#xff1a;Linux &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;数据结构专栏&#xff1a;数据结构 &#x1f308;C专栏&#xff1a;C 文章目录 0. Java语言的发展史1.概述1.1 什么是Java1.2 …...

2024年上海小学生古诗文大会倒计时30多天:做几道今年的官方模拟题

2024年上海市小学生古诗文大会自由报名活动的初赛日期于10月19日开始&#xff0c;距离今天只有34天了。 小学生古诗文大会考什么&#xff1f;怎么考呢&#xff1f;今天好真题就带着大家来做一做官方发布的2024年小学生古诗文大会的模拟题&#xff0c;根据往年的经验&#xff0…...

IDEA 常用配置和开发插件

件市场中搜索并安装“Git Integration”插件。 一、前言 在本篇文章中我会为大家总结一些我自己常用的配置和开发插件&#xff0c;此外也给大家提供一个建议&#xff0c;可以根据自己的项目需求和个人偏好选择适合的插件。另外&#xff0c;IDEA 也在不断更新&#xff0c;可能会…...

还在为企微联系人烦恼?一招解决!企业微信2024年效率升级全攻略

现在信息多得让人眼花&#xff0c;微信里头那些企业微信的联系人是不是让你头疼&#xff1f; 看着满屏的绿色头像&#xff0c;心里想&#xff1a;“我就想和朋友聊聊天&#xff0c;怎么就这么难&#xff1f;”别急&#xff0c;今天教你个办法&#xff0c;轻松搞定这些小烦恼&am…...

【docker npm】npm 私库

1.部署环境 window 11 x64Docker Desktop 4.34.1 (166053) Docker Engine v27.2.0 1.1.Docker 镜像源 1.1.1.Docker Engine 配置 {"builder": {"features": {"buildkit": true},"gc": {"defaultKeepStorage": "32…...

完整gpt应用(自用)

qrc.py 把gpt_qrc.qrc转化成gpt_qrc.py pyrcc5 -o icons_rc.py icons.qrc <RCC><qresource prefix"img"><file>img/53.png</file><file>img/ai.png</file><file>img/关闭.png</file><file>img/最小化.png&l…...

【信息论基础第二讲】离散信源的数学模型及其信息测度包括信源的分类、信源的数学模型、离散信源的信息测度、二元信源的条件熵联合熵

一、信源的分类 二、信源的数学模型 1、信源的概念 在通信系统中&#xff0c;收信者在未收到信息以前&#xff0c;对信源发出什么消息是不确定的、随机的、因此我们可以用随机变量、随机序列或者随机过程来描述信源的输出。严格地说&#xff0c;用概率空间来描述信源输出。 …...

在 Spring Boot 项目中连接 IBM AS/400 数据库——详细案例教程

文章目录 1. 添加 jt400 依赖2. 下载 jt400 驱动包依赖下载手动下载下载地址&#xff1a;手动下载 JAR 的步骤&#xff1a; 3. 配置 application.properties 或 application.yml&#xff08;1&#xff09;application.properties&#xff08;2&#xff09;application.yml 4. 数…...

VUE + NODE 历史版本安装

以node 12.20.0为例子&#xff0c;想下载哪个版本&#xff0c;后面写哪个版本 https://registry.npmmirror.com/binary.html?pathnode/v12.20.0/ 安装国内镜像7.1.0 cnpm npm install -g cnpm7.1.0 -g --registryhttps://registry.npmmirror.com 安装vue脚手架4.5.15 cnpm …...

git reset 几点疑问

疑问&#xff1a;使用 git reset --hard <commit-hash-from-branch-B> 将工作区状态reset为其他branch的某点。 如果当前工作区的分支&#xff08;比如 branch A&#xff09;上使用 git reset --hard 将其状态重置为另一个分支&#xff08;比如 branch B&#xff09;的某…...

Rust Windows下编译 静态链接VCRuntime140.dll

Rust 编译出来的exe默认动态链接VC运行库&#xff0c;分发电脑上需要安装有Microsoft Visual C Redistributable for Visual Studio 2015运行库。 编译时能静态链接进去&#xff0c;就省去客户端未安装运行库的问题。方法如下: 只需在当前根目录下新建.cargo\config.toml&#…...

从“天宫课堂”到人工智能:中国少儿编程的未来在哪里?

近日&#xff0c;中国载人航天“天宫课堂”第三次开讲&#xff0c;激发了全国数百万青少年对科技的热情。从航天技术到人工智能&#xff0c;科技的快速发展正不断改变我们的生活&#xff0c;也让越来越多的家长意识到&#xff0c;未来属于那些掌握编程和创新思维的孩子。与其让…...

ARM base instruction -- blr

BLR Branch with Link to Register calls a subroutine at an address in a register, setting register X30 to PC4. 带寄存器链接的分支在寄存器中的某个地址调用一个子程序&#xff0c;将寄存器 X30 (lr) 设置为 PC4。 BLR <Xn> BLR 跳转到reg内容地址&#xff0c;…...

宠物猫领养馆会员管理系统---附源码72579

目录 1 绪论 1.1 课题目的与意义 1.2国内外研究现状 1.3论文结构与章节安排 1.4 express框架介绍 2 宠物猫领养馆会员管理系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 操作可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 …...

非标设备集成指南:如何用德创V+平台统一管理相机、PLC和视觉算法

非标设备集成实战&#xff1a;基于V平台的视觉系统协同管理方案 在工业自动化领域&#xff0c;非标设备集成往往面临多品牌硬件兼容性差、通讯协议复杂、调试周期长等痛点。传统解决方案需要工程师编写大量底层代码来桥接不同设备&#xff0c;不仅效率低下&#xff0c;后期维护…...

AI编码工作流:工程化实践框架与团队效能提升

1. 项目概述&#xff1a;从“AI编码工作流”说起最近在GitHub上看到一个挺有意思的项目&#xff0c;叫nicksp/ai-coding-workflow。光看这个名字&#xff0c;可能很多朋友会想&#xff0c;这不就是又一个教你怎么用ChatGPT或者Copilot写代码的教程吗&#xff1f;说实话&#xf…...

从数据同步工具往后看,NineData 社区版 V5.0.0 这次补齐了什么

从数据同步工具和 ChatDBA 这类能力往后看&#xff0c;V5.0.0 更像一次连续补强&#xff0c;而不是单点加功能。再结合异构数据库迁移工具这类需求&#xff0c;链路扩展、迁移评估和智能诊断一起往前推&#xff0c;社区版的可用边界也随之往前走了一步。落地之前先看这套能力框…...

基于TypeScript的MCP服务器开发指南:为AI助手构建安全工具调用能力

1. 项目概述&#xff1a;一个为TypeScript开发者打造的MCP服务器最近在折腾AI应用开发&#xff0c;特别是想给Claude、Cursor这类智能助手扩展更强大的工具调用能力时&#xff0c;不可避免地接触到了Model Context Protocol。如果你也在研究如何让AI助手安全、可控地访问文件系…...

Kirara-AI:全栈AI应用开发框架,快速构建生产级智能助手

1. 项目概述&#xff1a;一个面向开发者的AI应用快速构建框架最近在折腾AI应用开发的朋友&#xff0c;应该都体会过那种“从想法到原型”的中间环节有多磨人。你想做一个能联网搜索的智能客服&#xff0c;或者一个能处理多格式文档的问答助手&#xff0c;光是搭建基础环境、处理…...

告别“模板感”:打造高转化企业官网的全流程指南

在互联网流量红利见顶的今天&#xff0c;企业官网早已不再是简单的“网络名片”。面对同质化严重的模板网站&#xff0c;用户早已审美疲劳。一个真正有价值的网站&#xff0c;不仅要颜值在线&#xff0c;更要有清晰的定位和严密的逻辑支撑。它既是品牌形象的门面&#xff0c;更…...

不想做程序员了,听说网络安全前景好,现在转行还来得及吗?

不想做程序员了&#xff0c;听说网络安全前景好&#xff0c;现在转行还来得及吗&#xff1f; 我去年四月份被裁员&#xff0c;找了两个月工作&#xff0c;面试寥寥无几&#xff0c;就算有也都是外包&#xff0c;而且外包也没面试通过。我经历了挫败&#xff0c;迷茫&#xff0…...

基于视觉大模型的GUI自动化:从原理到实践

1. 项目概述&#xff1a;当GUI自动化遇见视觉大模型 最近在折腾自动化测试和RPA&#xff08;机器人流程自动化&#xff09;的时候&#xff0c;我遇到了一个老生常谈但又极其棘手的问题&#xff1a;如何稳定、高效地识别和操作那些没有标准控件标识的图形界面元素&#xff1f;传…...

AI智能体长期记忆架构:构建Agent Shadow Brain解决上下文限制

1. 项目概述&#xff1a;当AI智能体拥有一个“影子大脑”最近在AI智能体开发领域&#xff0c;一个名为“Agent Shadow Brain”的项目引起了我的注意。这个项目由开发者theihtisham发起&#xff0c;其核心思想是为大型语言模型驱动的智能体配备一个独立的、持续运行的“影子大脑…...

CircuitPython实战:用传感器数据驱动NeoPixel灯光效果

1. 项目概述如果你刚拿到一块像Adafruit Circuit Playground Express这样的开发板&#xff0c;看着上面一圈彩色的NeoPixel LED和一堆传感器&#xff0c;可能会有点无从下手。别担心&#xff0c;这几乎是每个嵌入式开发者的必经之路。这块板子集成了光传感器、温度传感器、加速…...