【问题标题】:Python's Requests on IIS with Flask | Connection Error使用 Flask 对 IIS 的 Python 请求连接错误
【发布时间】:2017-02-07 09:36:22
【问题描述】:

我一直在努力让 Flask 应用程序在我的 IIS 服务器上运行,并通过以下链接取得了一些进展:

http://netdot.co/2015/03/09/flask-on-iis

话虽如此,当我通过 IIS 部署时尝试使用“请求”python 模块时,我遇到了麻烦。当我在本地启动应用程序时,它运行良好——也就是说,如果我通过终端启动应用程序,我会在请求 JSON 数据时得到正确的 响应

> python app.py

本质上,应用程序通过其 API 从我的 Stash 存储库请求 JSON 数据。 Stash 的 API 需要对此获取请求进行用户身份验证。 requests 模块让它变得很容易......我尽可能避免使用原始 HTML(网络新手......>.

当部署在 IIS 上时,我在 Python 中收到以下错误异常,但不确定原因:

ConnectionError: ('Connection aborted.', error(13, 'Permission denied'))

您可以参考下面的整个代码(省略机密内容)。 基本上,我有一个使用用户凭据的 login.html 页面。 然后,我使用这些凭据发送 get 请求

try:
    reqLib = requests.get('https://stash/rest/api/latest/projects/PLAN/repos/sqlquerylibrary/files?at=refs%2Fheads%2Fmaster&limit=100000', auth=(usr, pwd), verify=False)
except Exception as e:
    return str(e)

整个应用程序:

import requests
from flask import Flask, render_template, redirect, url_for, request, send_from_directory
from flask_login import LoginManager, UserMixin, login_required, login_user
import sys
import os

app = Flask(__name__)
login_manager = LoginManager()
login_manager.init_app(app)

user = ''
reqLib = ''

#Add headers to force no-cache
@app.after_request
def add_header(r):
    r.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
    r.headers["Pragma"] = "no-cache"
    r.headers["Expires"] = "0"
    r.headers["Cache-Control"] = "public, max-age=0"
    return r

#post-processing/loading screen -- you can ignore this route
@app.route("/scripting")
@login_required
def script():
    scrape()
    return redirect(url_for('display'))

#Page displays AFTER a successful <200> response
@app.route("/sqlLibraryDisplay",methods=["GET"])
@login_required
def display():
    return send_from_directory("static","index.html")

#Login Page
@app.route('/sqlLibrary', methods=['GET', 'POST'])
def login():
    error = None
    global reqLib
    global user

    if request.method == 'POST':
        #Grabs username & password entered by user
        usr = str(request.form['username'])
        pwd = str(request.form['password'])

        #Requests SQL Library list from Stash repository
        try:
            reqLib = requests.get('https://stash/rest/api/latest/projects/PLAN/repos/sqlquerylibrary/files?at=refs%2Fheads%2Fmaster&limit=100000', auth=(usr, pwd), verify=False)
        except Exception as e:
            return str(e)

        if reqLib.status_code != 200:
            error = 'Invalid Credentials. Please try again.'
        else:
            user = User(usr,pwd)
            login_user(user)
            return redirect(url_for('script'))

    return render_template('login.html', error=error)

@login_manager.user_loader
def load_user(id):
    global user
    global reqLib

    if user != '':
        if reqLib.status_code == 200:
            return user

    return None

class User(UserMixin):

    def __init__(self, name, id, active=True):
        self.name = name
        self.id = id
        self.active = active

    def is_active(self):
        return self.active

    def is_anonymous(self):
        return False

    def is_authenticated(self):
        return True

def scrape():
    #confidential. Just some post-processing using reqLib data.

if __name__ == "__main__":
    app.config["SECRET_KEY"] = "MAD_SECRET_KEY"
    app.run()

【问题讨论】:

    标签: python json iis flask python-requests


    【解决方案1】:

    我找到了答案。发帖以帮助任何决定在 IIS 上实施 Flask 的人,这些人可能会遇到同样的问题。

    权限错误确实是 IIS 端的问题。 您必须更改 IIS 的权限设置。这个链接帮助了我:

    IIS7 Permission Denied - ASP File Write

    在 IIS 管理器中,我单击了“连接”窗格中的 应用程序池。 然后改为选择我的 Flask 应用程序(不是链接中所述的 DefaultAppPool)。 我右键单击它并选择高级设置。 然后我将 Process Model 部分下的 Identity 字段更改为 LocalSystem。 点击确定。

    在此更改之后,python requests 模块会收到带有成功身份验证凭据的 响应并避免连接错误! ^^

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      • 2014-08-11
      • 1970-01-01
      • 2021-04-09
      • 1970-01-01
      • 2021-06-11
      相关资源
      最近更新 更多