[英]Python's Requests on IIS with Flask | Connection Error
我一直在努力使Flask應用程序在IIS服務器上運行,並且由於以下鏈接而取得了一些進展:
http://netdot.co/2015/03/09/flask-on-iis
這樣說來,當我通過IIS進行部署時,嘗試使用“請求” python模塊時,我遇到了麻煩。 當我在本地啟動該應用程序時,該應用程序運行良好-也就是說,如果我通過終端啟動該應用程序,則在請求JSON數據時收到正確的<200>響應
> python app.py
。
本質上,該應用程序通過其API從我的Stash存儲庫請求JSON數據。 Stash的API需要對此get請求進行用戶身份驗證。 請求模塊使操作變得很容易...我正在盡可能避免使用原始HTML(Web noob ...>。<;)。
在IIS上部署時,我在Python中收到以下錯誤異常,但不知道為什么:
ConnectionError: ('Connection aborted.', error(13, 'Permission denied'))
您可以在下面引用整個代碼(忽略機密內容)。 基本上,我有一個login.html頁面,其中包含用戶憑據。 然后,我使用這些憑據發送獲取請求
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()
我找到了答案。 發布以幫助決定在IIS上實施Flask的任何人,而這可能會遇到同一問題。
權限錯誤確實是IIS方面的問題。 您必須更改IIS的權限設置。 該鏈接幫助我:
在IIS管理器中,我單擊“連接”窗格中的“ 應用程序池 ”。 然后改為選擇我的Flask應用程序(而不是鏈接中所述的DefaultAppPool)。 我右鍵單擊它,然后選擇“ 高級設置” 。 然后我將“ 流程模型”部分下的“ 標識”字段更改為LocalSystem 。 點擊確定。
進行此更改后,python請求模塊將獲得帶有成功身份驗證憑據的<200>響應,並避免了連接錯誤! ^^
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.