Flask 函数 url_for 不适用于 Bluehost 上的子域部署

2024-04-16

我在 Bluehost 根目录下的子目录中部署了一个非常简单的 Flask 应用程序,名为“app”。希望 example.com 指向主页,example.com/app 指向我的 Flask 应用程序。实际上,当脚本 index.py 如下所示时,Flask 应用程序运行得很好:

from flask import Flask

app = Flask(__name__)

@app.route('/', methods=['GET'])
def home():
    return 'Hello world'

if __name__ == "__main__":
    app.run()

但当我引入一个简单的登录功能时,事情变得很糟糕,其 doc 结构和 index.py 如下所示:

文档结构:

public_html                     
|--app                          
     |--.htaccess
     |--index.fcgi
     |--index.py
     |--static
        |--login.html
     |--templates
        |--home.html

索引.py:

from flask import Flask, url_for, request, render_template, redirect, session
app = Flask(__name__)

@app.route('/', methods=['GET'])
def home():
    if not session.get('user'):
        return redirect(url_for('login'))     #go to login page if not logined
    else:
        return render_template('home.html')   #otherwise go to home page

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return app.send_static_file('login.html')
    else:
        user = request.form.get('user')
        password = request.form.get('password')
        if user == 'joy' and password == 'joy':
            session['user'] = user
            return render_template('home.html')
        else:
            return 'LOGIN FAILED'

if __name__ == "__main__":
    app.run()

但是,访问 example.com/app 会导致 URL 更改为 example.com/login,并且会出现合理的 404 错误,因为 example.com/login 不会映射到任何文档。

return redirect(url_for('login'))

url_for('login') 返回 example.com/login 而不是 example.com/app/login。这就是为什么后一个版本的index.py 不起作用。我尝试了很多事情但没有找到任何解决办法。请帮忙。谢谢!

我的.htaccess:

Options +ExecCGI
AddHandler fcgid-script .fcgi
RewriteEngine On
#RewriteBase /app/        # Neither RewriteBase / or RewriteBase /app/  work
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.fcgi/$1 [QSA,L]

我的索引.fcgi:

import sys
sys.path.insert(0, '/path_to_my_python_site-packages')

from flup.server.fcgi import WSGIServer
from index import app

class ScriptNameStripper(object):
   def __init__(self, app):
       self.app = app

   def __call__(self, environ, start_response):
       environ['SCRIPT_NAME'] = ''
       return self.app(environ, start_response)

app = ScriptNameStripper(app)

if __name__ == '__main__':
    WSGIServer(app).run()

以下内容现在对我有用。

  1. 在 .htaccess 中注释 RewriteBase

  2. 使用自定义的 url_for 更新了 index.py

    from flask import Flask, redirect, url_for
    
    app = Flask(__name__)
    
    def strip_url(orig):
       return orig.replace('index.fcgi/', '')
    
    @app.route('/', methods=['GET'])
    def home():
        return redirect(strip_url(url_for('login')))
    
    @app.route('/login', methods=['GET'])
    def login():
        return 'please login'
    
    if __name__ == "__main__":
        app.run()
    

如果非要下结论的话我想说官方Flask fastcgi 文档 http://flask.pocoo.org/docs/0.10/deploying/fastcgi/要求 RewriteRule 从 url 中删除 ***.fcgi,这对于从代码内发起的重定向不起作用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flask 函数 url_for 不适用于 Bluehost 上的子域部署 的相关文章

随机推荐

  • 基于内容的 RxJava Observable 缓冲区

    我使用 vertX 和 RxJava 启动了一个项目 但遇到了一个问题 但没有找到解决方案 我有一个 Observable 它为传入通信发出 WebSocketFrame 每个 WebSocketFrame 由有效负载 ByteBuffer
  • 大写和 NoClassDefFoundError 与 ClassNotFoundException

    我发现不同平台上 Class forName 何时抛出 ClassNotFoundException 以及何时抛出 NoClassDefFoundError 存在差异 这种行为是否在某处明确定义 或者我偶然发现了一个错误 考虑以下代码 它是
  • spring-data-jpa 不从 oracle.jdbc.driver.forwardonlyreswultset 进行转换

    我正在连接到 oracle 数据库 我刚刚解决了依赖问题 在以下网址中有所需的代码 如存储库 实体等 spring data jpa 1 11 16 带游标的存储过程 https stackoverflow com questions 53
  • 使用不同数据集的 UNION ORDER BY (T-SQL)

    我有一个疑问UNION的两个有点相似的数据集 但它们都有一些在另一个数据集中不存在的列 即 这些列在结果中具有 NULL 值 UNION 问题是 我需要ORDER使用仅存在于一个或另一组中的那些列来生成结果数据 以便以软件端友好的格式获取数
  • GAE 数据存储游标是否永久且持久?

    这么说是否正确com google appengine api datastore Cursor只是将索引位置存储到 GAE 数据存储索引中 游标耐用吗 也就是说 我可以永久存储游标并一次又一次地重复使用它 并确定如果它指向索引中的第 50
  • 是否可以为 Azure 辅助角色设置机器密钥

    我在 Azure 辅助角色中托管了一个 Owin WebAPI 服务器 Owin Authentication中间件似乎使用MachineKey来加密和生成Token 当我只有一个该角色的实例时 这非常有效 但是一旦我想使用多个实例 每个实
  • HTML5 替代基于闪存的 ZeroClipboard 来安全地将数据复制到剪贴板?

    随着 Flash 在许多环境 iPhone Android IE10 等 中逐渐淘汰 是否有任何浏览器即将推出新的解决方案 允许在不安装 Flash 的情况下将信息安全复制到剪贴板 我一直在使用零剪贴板 https github com j
  • TextRenderInfo 在 iTextSharp 中如何工作?

    我从网上得到了一些代码 他们为我提供了字体大小 我不明白 TextRenderInfo 如何读取文本 我尝试使用 renderInfo GetText 它给出随机数量的字符 有时是 3 个字符 有时是 2 个字符或更多或更少 我需要知道 r
  • 对 .NET Core 中的 web.config 感到困惑

    关于 web config 和 NET Core 有很多相互矛盾的说法 Places saying it s gone https dotnetcore show episode 10 configuration in net core h
  • 从另一个 Activity 返回时 SearchView 获得焦点并打开键盘

    当我从另一个活动返回主活动时 searchView 获得焦点并且键盘打开 我设法使用以下方法阻止键盘打开 getWindow setSoftInputMode WindowManager LayoutParams SOFT INPUT ST
  • Pandas group-by 累加和的比例从0开始

    我有以下 pandas 数据框 没有最后 2 列 name day show in appointment previous missed appointments proportion previous missed 0 Jack 202
  • 从父级 React 刷新子级状态

    我有一个包含一些数据的表 表中的每个元素都是一个 React 类组件 它看起来像这样 我想要的只是有一个用于 检查所有 功能的复选框 左上角复选框 问题是我不知道如何解决这个问题 因为props and state 我在单元素组件中有类似的
  • 如何向变量添加条件 - GAMS

    在我尝试构建的模型中 我有一个变量定义为 Variables x i j number of motors produced in month i to be delivered in month j 在该变量中 j 必须始终等于或大于 i
  • 无法读取更新的 AnyLogic DB 值

    我目前正在使用 AnyLogic 数据库来存储已用停车容量 我编写了一个函数来读取数据库并为每个存储的集装箱或拖车分配一个 id 然后 使用 UPDATE 查询来更新数组 数据库读取是使用数据库查询工具指定的 selectfrom 执行的
  • 如何将类添加到开槽元素?

    In my my dropdown模板中的组件 我有这个
  • Rails 中的奇怪错误 - 缺少助手

    我不确定 但这可能与崩溃的计算机有关 重新启动后 崩溃后 我收到丢失助手错误 其中助手名称错误 切换分支对结果没有影响 错误是 缺少帮助程序文件 helpers users xxxx sites xxxx app helpers accou
  • 如何在关闭 rowselect 的情况下为 DBGrid 中的整行着色?

    RowSelect 破坏了 OnCellClick 的功能 因此我需要关闭 RowSelect 那么如何通过突出显示当前行的所有单元格来模拟行选择的外观呢 这对我有用 dgRowSelect False and dgMultiSelect
  • 带有 Joomla 的 Intranet 网站?

    我的公司想在局域网上建立一个小型的内联网门户 我们最多大约有 100 个用户 我正在考虑在带有 XAMPP 的 Windows 服务器环境上使用 Joomla 为了安全起见 XAMPP 为大约 50 到 100 个用户提供服务是否有效 它有
  • 从视频获取MediaStreamTrack(音频)

    我想在从画布录制的同时从视频元素录制音频 我有 var stream canvas captureStream 29 现在我将视频的audioTrack 添加到流中 var vStream video captureStream strea
  • Flask 函数 url_for 不适用于 Bluehost 上的子域部署

    我在 Bluehost 根目录下的子目录中部署了一个非常简单的 Flask 应用程序 名为 app 希望 example com 指向主页 example com app 指向我的 Flask 应用程序 实际上 当脚本 index py 如