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

news2024/9/29 11:37:59

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_app

def 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_for

app = 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_string
    return f"""本页地址: {url_for('hello')}  
           <br> 模板: {render_template_string("{{ url_for('static', filename='style.css') }}")}"""

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

3. 将前缀加入到配置中

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

from flask import current_app

def 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/

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

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

相关文章

sqli-labs Basic Challenge Less_1 通关指南

sqli-labs Basic Challenge Less_1 通关指南 测试注入点测试注入点的数据类型测试过程&#xff1a; 测试返回点&#xff1a;测试列数&#xff1a;测试返回点&#xff1a; 收集数据&#xff1a;版本用户权限库名表名与列名 查找敏感信息 测试注入点 在进行SQL注入之前&#xff…

React js Router 路由 2, (把写过的几个 app 组合起来)

完整的项目&#xff0c;我已经上传了&#xff0c;资源链接. 起因&#xff0c; 目的: 每次都是新建一个 react 项目&#xff0c;有点繁琐。 刚刚学了路由&#xff0c;不如写一个 大一点的 app &#xff0c;把前面写过的几个 app, 都包含进去。 这部分感觉就像是&#xff0c; …

打包部署若依(RuoYi)SpringBoot后端和Vue前端图文教程

打包后端‘ 1&#xff0c;打开若依&#xff0c;点击右侧的Maven展开Maven管理&#xff0c;选择ruoyi>Lifecycle 先双击clean清除原本启动项目时生成的文件。然后点击package等待项目打包&#xff0c;切记要取消运行再打包 打包完成后会在ruoyi-admin>src>target里面…

Qt 边框border - qss样式

border属性 实际上&#xff0c;border并不是一个单独的属性&#xff0c;在Qt样式表中&#xff0c;它通常指的是一系列与边框相关的属性的组合。然而&#xff0c;你也可以在一条样式规则中一次性设置所有这些值&#xff0c;如下所示&#xff1a; QPushButton { border: 2px sol…

HTB-Unified(log4j2漏洞、MongoDb替换管理员密码)

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天给大家讲解Unified靶机 渗透过程 信息搜集 服务器开放了SSH服务&#xff0c;HTTP服务 访问网站 验证log4j2漏洞 8443端口&#xff1a;UniFi 网络 &#xff0c;访问查询 是否有Nday漏洞利用 可以观察到UniFi的版…

汇编实现从1加到1000(《X86汇编语言 从实模式到保护模式(第2版》) 第135页第2题解答)

题目: 编写一段主引导扇区程序,计算从1加到1000的和,并在屏幕上显示结果 输出结果: 代码: jmp near start text db 123...1000 start:mov ax,0x07c0mov ds,ax ;数据段从主引导区开始mov ax,0xb800mov es,ax ;显存地址从B8000物理地址开始mov si,text ;si指向text的第…

linux系统安装miniconda3

一、下载minconda3 下载地址&#xff1a;https://docs.conda.io/en/latest/miniconda.html 一般国内访问比较困难&#xff0c;可到清华软件镜像站 Index of /anaconda/miniconda/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 需要特别注意自己的下载版本和自己的…

苹果CMS海洋CMS那个更容易被百度收录?苹果CMS站群

SEO优化和搜索引擎的友好性常常是网站管理员关注的重点。苹果CMS&#xff08;maccmscn&#xff09;和海洋CMS都是国内常见的CMS平台&#xff0c;但在搜索引擎优化&#xff08;SEO&#xff09;和百度收录方面&#xff0c;苹果CMS凭借其优秀的插件生态系统&#xff0c;特别是泛目…

Java 类一口气给你讲完!(✿◡‿◡)

Java 类实例 Java面向对象设计 - Java类实例 以下是创建类的实例的一般语法: new <Class Constructor>;new 运算符后面是对构造函数的调用。 new 运算符通过分配堆上的内存来创建类的实例。以下语句创建Dog类的实例: new Dog();Dog()是对Dog类的构造函数的调用。 当…

PTT:Point Tree Transformer for Point Cloud Registration 论文解读

目录 一、导言 二、相关工作 1、基于Transformer的点云配准 2、针对点云的局部注意力 三、PTT 1、KPconv提取特征 2、Tree Transformer Encoder 3、Decoder 4、估计姿态 5、损失函数 四、实验 1、对比不同Backbone 2、运行时间对比 3、对比不同PTT方法下RR指标的…

[机器学习]决策树

1 决策树简介 2 信息熵 3 ID3决策树 3.1 决策树构建流程 3.2 决策树案例 4 C4.5决策树 5 CART决策树&#xff08;分类&回归&#xff09; 6 泰坦尼克号生存预测案例 import pandas as pd from sklearn.model_selection import train_test_split from sklearn.tree import …

starUML使用说明文档[简单易懂/清晰明了]||好上手

1. 安装 StarUML 首先&#xff0c;您需要从 StarUML 官方网站&#xff08;http://staruml.io/&#xff09;下载最新版本的 StarUML 安装包。然后&#xff0c;按照提示进行安装。&#xff08;联想可以从软件管家里下载&#xff09; 2. 打开 StarUML 安装完成后&#xff0c;双击桌…

mac上Charles怎么配置,可以抓取浏览器/IDEA的接口

一、抓取浏览器接口 1、下载安装Charles后&#xff0c;按下图操作安装证书&#xff0c;mac撒好难过要把证书调整为可信任 2、打开macOS代理 方式一&#xff1a;指点开启这里 方式二&#xff1a;进入代理配置中开启&#xff0c;结果和方式一一样的 3、这时就可以抓取到浏览器…

高职院校人工智能技术和无人机技术实训室建设方案

一、方案背景与需求分析 1.1 人工智能与无人机技术发展概况 人工智能&#xff08;AI&#xff09;和无人机技术作为当今科技领域的两大热点&#xff0c;正以前所未有的速度发展和渗透到各行各业中。根据国际数据公司(IDC)的报告&#xff0c;全球人工智能市场规模预计将在2024年…

Oracle按照某一字段值排序并显示,相同的显示序号

Oracle按照某一字段值排序并显示,相同的显示序号 最近的工作遇到对于相同的字段,按照序号去显示值,并对相同的值进行排序 实验了半天,感觉满意的答案,分享给大家 第一种: ROW_NUMBER 语法: ROW_NUMBER() OVER (ORDER BY your_column) AS sequence_number 说明: 根据your_column…

Python 数学建模——ARMA 时间序列分析

文章目录 前言使用前提平稳性检验白噪声检验 用法代码实例第一步——平稳性分析方法一方法二方法三 第二步——白噪声分析第三步——确定参数第四步——模型构建与检验检验模型效果预测未来数据 前言 常见的时间序列分析方法有很多&#xff0c;之前介绍了一个稍微新颖的 Prophe…

55 mysql 的登录认证流程

前言 这里我们来看一下 mysql 的认证的流程 我们这里仅仅看 我们最常见的一个 认证的处理流程 我们经常会登录的时候 碰到各种异常信息 认证失败的大体流程 大概的流程是这样 客户端和服务器建立连接之后, 服务器向客户端发送 salt 然后 客户端根据 salt 将客户端传入的…

MySQL权限控制(DCL)

我的mysql里面的一些数据库和一些表 基本语法 1.查询权限 show grants for 用户名主机名;例子1&#xff1a;查询权限 show grants for heima%;2.授予权限 grant 权限列表 on 数据库名.表名 to 用户名主机名;例子2&#xff1a; 授予权限 grant all on itcast.* to heima%;…

<<编码>>第 12 章 二进制加法器--二进制加法器 示例电路

info::操作说明 鼠标单击逻辑输入切换 0|1 状态 另: 因节点较多, 为避免过多连线, 此处采用标签虚拟连接方式, 相同的标识符表示连接在一起 关于标签虚拟连接的介绍见该链接: https://book.xiaogd.net/usage-of-circuitjs/circuitjs-label-simplify-circuit.html primary::在线…

《订单来了2024中秋预订趋势报告》发布:截至9月13日,商家中秋预订率上涨42.73%,山西文化巡礼成顶流

# 截至9月13日&#xff0c;订单来了酒店民宿已突破16万&#xff0c;商家中秋假期平均预订率较9月8日上涨42.73%。 对比6天前&#xff0c;酒店商家中秋平均预订率增长38.85%&#xff0c;民宿商家增长38.10%。 1%的酒店民宿达成「连续3天满房」成就&#xff0c;4%商家预订率超…