2017-02-07 2 views
0

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

Antwort

0

ich die Antwort gefunden. Posting, um jedem zu helfen, der sich für die Implementierung von Flask auf IIS entscheidet, die möglicherweise zu diesem Problem führt.

Der Berechtigungsfehler war tatsächlich ein Problem auf der IIS-Seite. Sie müssen die Berechtigungseinstellungen von IIS ändern. Dieser Link half mir aus:

IIS7 Permission Denied - ASP File Write

im IIS-Manager klickte ich Anwendungspools in Bereich Verbindungen. Dann wählte stattdessen meine Flask-Anwendung (nicht DefaultAppPool wie in der Verknüpfung angegeben). Ich habe mit der rechten Maustaste darauf geklickt und Erweiterte Einstellungen ausgewählt. Dann änderte ich die Identität Feld unter Prozess Modell Abschnitt zu LocalSystem. Klicken Sie auf OK.

Nach dieser Änderung erhält das Python-Request-Modul eine < 200> Antwort mit erfolgreichen Authentifizierungsdaten & vermeidet den Verbindungsfehler! ^^