使用Flask的Python对IIS的请求连接错误

时间:2017-02-07 09:36:23

标签: python json iis flask python-requests

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

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

说到这一点,我在试图使用"请求"时遇到了麻烦。我在IIS上部署时的python模块。当我在本地启动应用程序时,该应用程序正常工作 - 也就是说,我得到一个合适的< 200>如果我通过终端

启动应用程序,请求JSON数据时的响应

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

实际上,应用程序通过其API从我的Stash存储库请求JSON数据。 Stash的API需要对此get请求进行用户身份验证。请求模块让我们很容易做到......我尽可能地避免使用原始HTML(web noob ...>。&lt ;;)。

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

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)

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

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()

整个应用程序:

{{1}}

1 个答案:

答案 0 :(得分:0)

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

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

IIS7 Permission Denied - ASP File Write

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

在此更改之后,python请求模块获得&lt; 200&gt;成功验证凭据的响应&amp;避免连接错误! ^^