2017-03-14 8 views
2

Ich versuche, den Decorator requires_auth (f) aus meiner Modelldatei zu verwenden. Docker-Compose-Protokoll gibt Folgendes an:Probleme beim Importieren von Methoden aus einer anderen Datei

Ich kann nicht scheinen, herauszufinden, warum das nicht bauen wird. Soweit ich das beurteilen kann, mache ich keine zirkulären Importe, die es kaputt machen würden, da der Rest meines Codes gut baut. Hier ist meine init Py

from flask import Flask, Response 

app = Flask(__name__) 

from flask import Flask 
from flask import render_template 
from flask import request, Response 
import models 

@app.route('/secret-page', methods=['GET']) 
@requires_auth 
def secret_page(): 
    users = models.retrieveUsers() 
    return render_template('secret.html' , users=users, current=current) 

@app.route('/', methods=['POST', 'GET']) 
def home(): 
    if request.method == 'POST': 
     username = request.form['username'] 
     password = request.form['password'] 
     phone = request.form['phone'] 
     models.insertUser(username, password, phone) 
     return render_template('index.html') 
    else: 
     return render_template('index.html') 

Und hier ist mein models.py

import sqlite3 as sql 
from functools import wraps 

q = """ 
CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    username TEXT NOT NULL, 
    password TEXT NOT NULL, 
    phone TEXT NOT NULL 
); 
""" 

con = sql.connect("database.db") 
cur = con.cursor() 
cur.execute(q) 

# original code from https://gist.github.com/PolBaladas/07bfcdefb5c1c57cdeb5 


def insertUser(username, password, phone): 
    con = sql.connect("database.db") 
    cur = con.cursor() 
    cur.execute("INSERT INTO users (username,password,phone) VALUES (?,?,?)", (username,password,phone)) 
    con.commit() 
    con.close() 

def retrieveUsers(): 
    con = sql.connect("database.db") 
    cur = con.cursor() 
    cur.execute("SELECT username, password, phone FROM users") 
    users = cur.fetchall() 
    con.close() 
    return users 

def retrieveUser(username): 
    con = sql.connect("database.db") 
    cur = con.cursor() 
    cur.execute("SELECT username, password FROM users WHERE username = (?)", [username]) 
    user = cur.fetchone() 
    con.close() 
    return user 

def check_auth(username, password): 
    """This function is called to check if a username/
    password combination is valid. 
    """ 
    return username == 'admin' and password == 'password' 

def authenticate(): 
    """Sends a 401 response that enables basic auth""" 
    return Response(
    'Could not verify your access level for that URL.\n' 
    'You have to login with proper credentials', 401, 
    {'WWW-Authenticate': 'Basic realm="Login Required"'}) 

def requires_auth(f): 
    @wraps(f) 
    def decorated(*args, **kwargs): 
     auth = request.authorization 
     if not auth or not check_auth(auth.username, auth.password): 
      return authenticate() 
     return f(*args, **kwargs) 
    return decorated 
+0

'@ requires_auth' ->' @ models.requires_auth' –

Antwort

1

Ein Flasky Ansatz wäre, die before_request Dekorateur zu verwenden. In Ihrem Fall:

from models import requires_auth 

@app.before_request 
def before(): 
    if request.path == url_for('secret-page'): 
     requires_auth() 

EDIT: vergaß ich url_for zu verwenden. Ich sollte know better.

Verwandte Themen