我一直在努力让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}}
答案 0 :(得分:0)
我找到了答案。发布以帮助任何决定在IIS上实施可能遇到同样问题的Flask的人。
权限错误确实是IIS方面的一个问题。 您必须更改IIS的权限设置。这个链接帮助了我:
IIS7 Permission Denied - ASP File Write
在IIS管理器中,我单击了“连接”窗格中的应用程序池。 然后选择我的Flask应用程序(不是链接中所述的DefaultAppPool)。 我右键单击它并选择高级设置。 然后,我将流程模型部分下的身份字段更改为 LocalSystem 。 点击确定。
在此更改之后,python请求模块获得&lt; 200&gt;成功验证凭据的响应&amp;避免连接错误! ^^