Flask 重定向混合内容错误,url 不是 https

Gab*_*ezH 5 javascript python https redirect flask

我正在开发 Flask 应用程序。我的视图之一包含动态创建的元素。为了收集值并将它们写入我的 MongoDB 数据库,我创建了一个 JS 脚本来遍历元素并将值提取到 JS 变量。之后,我通过 AJAX $.post()方法将它们发布到我的 Flask 后端。该部分工作正常,但是当到达函数末尾时@app.route,我尝试重定向到另一个登录页面,出现以下错误:

混合内容:“ https://cocktail-recipe-book-gabyguedezh.c9users.io/get_add_cocktail_form ”页面是通过 HTTPS 加载的,但请求了不安全的 XMLHttpRequest 端点“ http://cocktail-recipe-book-gabyguedezh.c9users ” .io/get_my_recipes '. 该请求已被阻止;内容必须通过 HTTPS 提供。

POST 本身被执行,并且表单将文档发送到我的数据库,但是,重定向没有发生。

整个后端路由如下所示:

@app.route('/write_to_cocktail_database', methods=['POST'])
def write_to_cocktail_database():
    recipes = mongo.db.recipes

    recipes.insert_one(request.json)

    return redirect(url_for('get_my_recipes'))
Run Code Online (Sandbox Code Playgroud)

为了以防万一,AJAX 函数如下所示:

$.ajax({
    url: formUrl,
    // data: {'data': steps},
    data: JSON.stringify({recipe_name,  recipe_url, recipe_description,
                        recipe_image, is_vegan, ingredients, steps,
                        base_spirit, cocktail_type, flavour_profile,
                        author_name, recipe_rating, number_of_votes}, null, '\t'),
    type: 'POST',
    contentType: 'application/json;charset=UTF-8',
    success: function(response) {
        console.log('success');
    },
    error: function(error) {
        console.log('error', error);
    }
});
Run Code Online (Sandbox Code Playgroud)

我尝试过以下方法:

用于特定视图的 SSL,如下所示

我尝试在应用程序的开头复制该代码(包括导入),然后使用@ssl_required下面的装饰器,@app.route如下所示:

@app.route('/write_to_cocktail_database', methods=['POST'])
@ssl_required
def write_to_cocktail_database():
    <rest of function>
    return redirect(url_for('get_my_recipes'))
Run Code Online (Sandbox Code Playgroud)

get_my_recipes我尝试重定向到的路线在哪里?这不起作用

我还尝试使用函数内部的替换方法来解决这个问题,如下所示:

if request.url.startswith('http://'):
        request.url = request.url.replace('http://', 'https://', 1)
Run Code Online (Sandbox Code Playgroud)

这也不起作用,因为我不知道如何将修改后的 URL 提供给重定向url_for(并且简单地这样做redirect(modified_url_as_string)也不起作用)。

现在,我知道该get_my_recipes路由适用于其他重定向,例如:

@app.route('/delete_cocktail/<recipe_id>')
def delete_cocktail(recipe_id):
    mongo.db.recipes.remove({'_id': ObjectId(recipe_id)})
    return redirect(url_for('get_my_recipes'))
Run Code Online (Sandbox Code Playgroud)

以上,删除菜谱并重定向到“我的菜谱”页面。

我不确定为什么我编写的 AJAX 函数中的 POST 没有重定向我,但常规 HTML 中的 POST<form>却可以工作。

我也不确定如何使用我找到的代码片段(在上面的链接中)中的装饰器,因为我只是在路线工作之前添加装饰器。

我还尝试了其他解决方法,例如通过 jQuery 对 AJAX 函数的成功部分进行重定向window.location.href = "https://cocktail-recipe-book-gabyguedezh.c9users.io/get_my_recipes";(它还抱怨重定向不安全)。我试图通过简单地解决重定向问题,render_template('my_recipes.html')但这也不起作用,似乎它必须是路线返回时的重定向。

我是网络开发和 Flask 的新手,所以我不确定如何使用在其他 SO 答案中找到的代码片段(例如这个答案,其中接受的答案似乎是我在所有路线之前放置的通用装饰器,但是这导致了“太多重定向错误”,该问题在评论中含糊地解决了,我不知道这意味着什么)。

我一直在寻找可以使用的答案,但我很沮丧,因为我发现的大多数答案都假设具有 Flask 的工作知识,并且大多数答案没有提供有关如何使用代码的简明示例(例如1)。

我非常感谢这里的某种指导,我不知道如何继续。