Ich habe gearbeitet Flask-Anwendungen erhalten auf meinem IIS-Server ausgeführt und haben einige Fortschritte dank untenstehenden Link gemacht:Pythons Anforderungen an IIS mit Flask | Connection Error
http://netdot.co/2015/03/09/flask-on-iis
Mit dieser gesagt, ich laufe in einen Kopf Scratcher beim Versuch, das Python-Modul "requests" bei der Bereitstellung über IIS zu verwenden. Die Anwendung funktioniert einwandfrei, wenn ich sie lokal starte - das heißt, ich erhalte eine korrekte < 200> Antwort beim Anfordern der JSON-Daten, wenn ich die App über das Terminal
> python app.py
starte.
Im Wesentlichen fordert die Anwendung JSON-Daten von meinem Stash-Repository über ihre API an. Stashs API erfordert Benutzerauthentifizierung für diese Abrufanforderung. Das Request-Modul hat es einfach gemacht ... Ich vermeide so viel HTML wie möglich (Web noob ...>. <;).
Ich erhalte die folgenden Fehler Ausnahme in Python, wenn die Bereitstellung auf IIS und nicht sicher, warum:
ConnectionError: ('Connection aborted.', error(13, 'Permission denied'))
Sie den gesamten Code (vertrauliche Sachen weggelassen) verweisen können. Grundsätzlich habe ich eine login.html Seite, die Benutzeranmeldeinformationen nimmt. Dann benutze ich diese Anmeldeinformationen die GET-Anforderung
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)
Entire App zu senden:
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()