Flask 从外部文件访问配置变量

Flask 从外部文件访问配置变量,flask,Flask,我正在构建一个Flask Web应用程序,我正在实现一个用户可以上传自己图像的功能。我正在处理三个文件以实现此功能: models.py:我在其中维护数据库结构和可以在数据库中的实体上调用的函数的文件 routes.py:处理站点对各种URL上HTTP请求的响应的文件 __init__u;.py:设置我的所有配置变量的地方 我在models.py中有一个名为avatar的函数,它返回用户的化身。如果他们没有上传照片,它会使用gravatars MD5哈希生成器生成一个化身。我想更改此函数,以

我正在构建一个Flask Web应用程序,我正在实现一个用户可以上传自己图像的功能。我正在处理三个文件以实现此功能:

  • models.py:我在其中维护数据库结构和可以在数据库中的实体上调用的函数的文件

  • routes.py:处理站点对各种URL上HTTP请求的响应的文件

  • __init__u;.py:设置我的所有配置变量的地方

我在models.py中有一个名为avatar的函数,它返回用户的化身。如果他们没有上传照片,它会使用gravatars MD5哈希生成器生成一个化身。我想更改此函数,以便它首先查看我的上载文件,查看用户是否上载了照片

我已经设置了上传功能,用户的照片将保存在以下格式的文件夹中。。我有一个名为UPLOAD\u FOLDER的配置变量,它存储该文件夹的绝对路径。但是,问题是配置变量无法从模型文件访问。我曾尝试创建一个本地上下文,如中所述,但遇到一个keyrerror:“UPLOAD\u FOLDER”错误

models.py


from flask import Flask, current_app
from hashlib import md5
class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key = True)
    username = db.Column(db.String(64), index = True, unique = True)
    email = db.Column(db.String(128), index = True, unique = True, nullable = False)
    password_hash = db.Column(db.String(128), nullable = False)
    is_admin = db.Column(db.Boolean(), default = False)
    polls = db.relationship("Poll", backref = "author", lazy = "dynamic")
    votes = db.relationship("Votes", backref = "voter", lazy = "dynamic")

   def avatar(self, size):
      app = Flask(__name__)
      with app.app_context():
      UPLOAD_FOLDER = current_app.config["UPLOAD_FOLDER"]
      if(UPLOAD_FOLDER):
         print("hooray")
      digest = md5(self.email.lower().encode("utf-8")).hexdigest()
      return(("https://www.gravatar.com/avatar/{}?d=retro&s={}").format(digest, size))
__初始值

import os 

dirname = os.path.dirname(os.path.abspath(__file__))
UPLOAD_FOLDER = dirname + "/static/user-images/"
ALLOWED_FILES = ["png", "jpeg", "jpg"]

app = Flask(__name__)
app.config.from_object(Config)
app.config["UPLOAD_FOLDER"] = UPLOAD_FOLDER
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024
app.config["ALLOWED_FILES"] = ALLOWED_FILES
routes.py

import os 
from werkzeug.utils import secure_filename
from flask_login import current_user

def allowed_file(file):
    return(file.filename.split(".")[1].lower() in app.config["ALLOWED_FILES"])

@app.route("/upload", methods = ["POST"])
@login_required
def upload_file():
    if(request.method == "POST"):
        if("file" not in request.files):
            print(request.files)
            flash("No file part")
            return(redirect("upload"))
        file = request.files["file"]
        if(not file.filename):
            flash("No file uploaded!")
            return(redirect("upload"))
        if(file and allowed_file(file)):
            extension = file.filename.split(".")[1]
            filename = secure_filename(str(current_user.id) + "." + extension)
            file.save(os.path.join(app.config["UPLOAD_FOLDER"], filename))
            flash("Files successfully uploaded")
            return(redirect(url_for("user", username = current_user.username)))

与其将配置变量推送到应用程序上下文中,不如将它们放在配置文件中,并在必要时导入它们

创建一个名为config.py的文件

config.py

import os

dirname = os.path.dirname(os.path.abspath(__file__))

UPLOAD_FOLDER = dirname + "/static/user-images/"
ALLOWED_FILES = ["png", "jpeg", "jpg"]
MAX_CONTENT_LENGTH = 16 * 1024 * 1024
import os 
from werkzeug.utils import secure_filename
from flask_login import current_user
from config import UPLOAD_FOLDER

def allowed_file(file):
    return(file.filename.split(".")[1].lower() in app.config["ALLOWED_FILES"])

@app.route("/upload", methods = ["POST"])
@login_required
def upload_file():
    if(request.method == "POST"):
        if("file" not in request.files):
            print(request.files)
            flash("No file part")
            return(redirect("upload"))
        file = request.files["file"]
        if(not file.filename):
            flash("No file uploaded!")
            return(redirect("upload"))
        if(file and allowed_file(file)):
            extension = file.filename.split(".")[1]
            filename = secure_filename(str(current_user.id) + "." + extension)
            file.save(os.path.join(UPLOAD_FOLDER, filename))
            flash("Files successfully uploaded")
            return(redirect(url_for("user", username = current_user.username)))
from flask import Flask, current_app
from hashlib import md5
from config import UPLOAD_FOLDER
class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key = True)
    username = db.Column(db.String(64), index = True, unique = True)
    email = db.Column(db.String(128), index = True, unique = True, nullable = False)
    password_hash = db.Column(db.String(128), nullable = False)
    is_admin = db.Column(db.Boolean(), default = False)
    polls = db.relationship("Poll", backref = "author", lazy = "dynamic")
    votes = db.relationship("Votes", backref = "voter", lazy = "dynamic")

   def avatar(self, size):
      app = Flask(__name__)
      with app.app_context():
          upload_folder = UPLOAD_FOLDER  # please don't make normal variables UPPERCASE
          if(upload_folder):
             print("hooray")
          digest = md5(self.email.lower().encode("utf-8")).hexdigest()
          return(("https://www.gravatar.com/avatar/{}?d=retro&s={}").format(digest, size))
然后在routes.py中导入这些配置变量并使用它们,将
app.config[“UPLOAD\u FOLDER”]
替换为
UPLOAD\u FOLDER

routes.py

import os

dirname = os.path.dirname(os.path.abspath(__file__))

UPLOAD_FOLDER = dirname + "/static/user-images/"
ALLOWED_FILES = ["png", "jpeg", "jpg"]
MAX_CONTENT_LENGTH = 16 * 1024 * 1024
import os 
from werkzeug.utils import secure_filename
from flask_login import current_user
from config import UPLOAD_FOLDER

def allowed_file(file):
    return(file.filename.split(".")[1].lower() in app.config["ALLOWED_FILES"])

@app.route("/upload", methods = ["POST"])
@login_required
def upload_file():
    if(request.method == "POST"):
        if("file" not in request.files):
            print(request.files)
            flash("No file part")
            return(redirect("upload"))
        file = request.files["file"]
        if(not file.filename):
            flash("No file uploaded!")
            return(redirect("upload"))
        if(file and allowed_file(file)):
            extension = file.filename.split(".")[1]
            filename = secure_filename(str(current_user.id) + "." + extension)
            file.save(os.path.join(UPLOAD_FOLDER, filename))
            flash("Files successfully uploaded")
            return(redirect(url_for("user", username = current_user.username)))
from flask import Flask, current_app
from hashlib import md5
from config import UPLOAD_FOLDER
class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key = True)
    username = db.Column(db.String(64), index = True, unique = True)
    email = db.Column(db.String(128), index = True, unique = True, nullable = False)
    password_hash = db.Column(db.String(128), nullable = False)
    is_admin = db.Column(db.Boolean(), default = False)
    polls = db.relationship("Poll", backref = "author", lazy = "dynamic")
    votes = db.relationship("Votes", backref = "voter", lazy = "dynamic")

   def avatar(self, size):
      app = Flask(__name__)
      with app.app_context():
          upload_folder = UPLOAD_FOLDER  # please don't make normal variables UPPERCASE
          if(upload_folder):
             print("hooray")
          digest = md5(self.email.lower().encode("utf-8")).hexdigest()
          return(("https://www.gravatar.com/avatar/{}?d=retro&s={}").format(digest, size))
在models.py中执行相同的操作,将
current\u app.config[“UPLOAD\u FOLDER”]
替换为
UPLOAD\u FOLDER

型号.py

import os

dirname = os.path.dirname(os.path.abspath(__file__))

UPLOAD_FOLDER = dirname + "/static/user-images/"
ALLOWED_FILES = ["png", "jpeg", "jpg"]
MAX_CONTENT_LENGTH = 16 * 1024 * 1024
import os 
from werkzeug.utils import secure_filename
from flask_login import current_user
from config import UPLOAD_FOLDER

def allowed_file(file):
    return(file.filename.split(".")[1].lower() in app.config["ALLOWED_FILES"])

@app.route("/upload", methods = ["POST"])
@login_required
def upload_file():
    if(request.method == "POST"):
        if("file" not in request.files):
            print(request.files)
            flash("No file part")
            return(redirect("upload"))
        file = request.files["file"]
        if(not file.filename):
            flash("No file uploaded!")
            return(redirect("upload"))
        if(file and allowed_file(file)):
            extension = file.filename.split(".")[1]
            filename = secure_filename(str(current_user.id) + "." + extension)
            file.save(os.path.join(UPLOAD_FOLDER, filename))
            flash("Files successfully uploaded")
            return(redirect(url_for("user", username = current_user.username)))
from flask import Flask, current_app
from hashlib import md5
from config import UPLOAD_FOLDER
class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key = True)
    username = db.Column(db.String(64), index = True, unique = True)
    email = db.Column(db.String(128), index = True, unique = True, nullable = False)
    password_hash = db.Column(db.String(128), nullable = False)
    is_admin = db.Column(db.Boolean(), default = False)
    polls = db.relationship("Poll", backref = "author", lazy = "dynamic")
    votes = db.relationship("Votes", backref = "voter", lazy = "dynamic")

   def avatar(self, size):
      app = Flask(__name__)
      with app.app_context():
          upload_folder = UPLOAD_FOLDER  # please don't make normal variables UPPERCASE
          if(upload_folder):
             print("hooray")
          digest = md5(self.email.lower().encode("utf-8")).hexdigest()
          return(("https://www.gravatar.com/avatar/{}?d=retro&s={}").format(digest, size))

与其将配置变量推送到应用程序上下文中,不如将它们放在配置文件中,并在必要时导入它们

创建一个名为config.py的文件

config.py

import os

dirname = os.path.dirname(os.path.abspath(__file__))

UPLOAD_FOLDER = dirname + "/static/user-images/"
ALLOWED_FILES = ["png", "jpeg", "jpg"]
MAX_CONTENT_LENGTH = 16 * 1024 * 1024
import os 
from werkzeug.utils import secure_filename
from flask_login import current_user
from config import UPLOAD_FOLDER

def allowed_file(file):
    return(file.filename.split(".")[1].lower() in app.config["ALLOWED_FILES"])

@app.route("/upload", methods = ["POST"])
@login_required
def upload_file():
    if(request.method == "POST"):
        if("file" not in request.files):
            print(request.files)
            flash("No file part")
            return(redirect("upload"))
        file = request.files["file"]
        if(not file.filename):
            flash("No file uploaded!")
            return(redirect("upload"))
        if(file and allowed_file(file)):
            extension = file.filename.split(".")[1]
            filename = secure_filename(str(current_user.id) + "." + extension)
            file.save(os.path.join(UPLOAD_FOLDER, filename))
            flash("Files successfully uploaded")
            return(redirect(url_for("user", username = current_user.username)))
from flask import Flask, current_app
from hashlib import md5
from config import UPLOAD_FOLDER
class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key = True)
    username = db.Column(db.String(64), index = True, unique = True)
    email = db.Column(db.String(128), index = True, unique = True, nullable = False)
    password_hash = db.Column(db.String(128), nullable = False)
    is_admin = db.Column(db.Boolean(), default = False)
    polls = db.relationship("Poll", backref = "author", lazy = "dynamic")
    votes = db.relationship("Votes", backref = "voter", lazy = "dynamic")

   def avatar(self, size):
      app = Flask(__name__)
      with app.app_context():
          upload_folder = UPLOAD_FOLDER  # please don't make normal variables UPPERCASE
          if(upload_folder):
             print("hooray")
          digest = md5(self.email.lower().encode("utf-8")).hexdigest()
          return(("https://www.gravatar.com/avatar/{}?d=retro&s={}").format(digest, size))
然后在routes.py中导入这些配置变量并使用它们,将
app.config[“UPLOAD\u FOLDER”]
替换为
UPLOAD\u FOLDER

routes.py

import os

dirname = os.path.dirname(os.path.abspath(__file__))

UPLOAD_FOLDER = dirname + "/static/user-images/"
ALLOWED_FILES = ["png", "jpeg", "jpg"]
MAX_CONTENT_LENGTH = 16 * 1024 * 1024
import os 
from werkzeug.utils import secure_filename
from flask_login import current_user
from config import UPLOAD_FOLDER

def allowed_file(file):
    return(file.filename.split(".")[1].lower() in app.config["ALLOWED_FILES"])

@app.route("/upload", methods = ["POST"])
@login_required
def upload_file():
    if(request.method == "POST"):
        if("file" not in request.files):
            print(request.files)
            flash("No file part")
            return(redirect("upload"))
        file = request.files["file"]
        if(not file.filename):
            flash("No file uploaded!")
            return(redirect("upload"))
        if(file and allowed_file(file)):
            extension = file.filename.split(".")[1]
            filename = secure_filename(str(current_user.id) + "." + extension)
            file.save(os.path.join(UPLOAD_FOLDER, filename))
            flash("Files successfully uploaded")
            return(redirect(url_for("user", username = current_user.username)))
from flask import Flask, current_app
from hashlib import md5
from config import UPLOAD_FOLDER
class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key = True)
    username = db.Column(db.String(64), index = True, unique = True)
    email = db.Column(db.String(128), index = True, unique = True, nullable = False)
    password_hash = db.Column(db.String(128), nullable = False)
    is_admin = db.Column(db.Boolean(), default = False)
    polls = db.relationship("Poll", backref = "author", lazy = "dynamic")
    votes = db.relationship("Votes", backref = "voter", lazy = "dynamic")

   def avatar(self, size):
      app = Flask(__name__)
      with app.app_context():
          upload_folder = UPLOAD_FOLDER  # please don't make normal variables UPPERCASE
          if(upload_folder):
             print("hooray")
          digest = md5(self.email.lower().encode("utf-8")).hexdigest()
          return(("https://www.gravatar.com/avatar/{}?d=retro&s={}").format(digest, size))
在models.py中执行相同的操作,将
current\u app.config[“UPLOAD\u FOLDER”]
替换为
UPLOAD\u FOLDER

型号.py

import os

dirname = os.path.dirname(os.path.abspath(__file__))

UPLOAD_FOLDER = dirname + "/static/user-images/"
ALLOWED_FILES = ["png", "jpeg", "jpg"]
MAX_CONTENT_LENGTH = 16 * 1024 * 1024
import os 
from werkzeug.utils import secure_filename
from flask_login import current_user
from config import UPLOAD_FOLDER

def allowed_file(file):
    return(file.filename.split(".")[1].lower() in app.config["ALLOWED_FILES"])

@app.route("/upload", methods = ["POST"])
@login_required
def upload_file():
    if(request.method == "POST"):
        if("file" not in request.files):
            print(request.files)
            flash("No file part")
            return(redirect("upload"))
        file = request.files["file"]
        if(not file.filename):
            flash("No file uploaded!")
            return(redirect("upload"))
        if(file and allowed_file(file)):
            extension = file.filename.split(".")[1]
            filename = secure_filename(str(current_user.id) + "." + extension)
            file.save(os.path.join(UPLOAD_FOLDER, filename))
            flash("Files successfully uploaded")
            return(redirect(url_for("user", username = current_user.username)))
from flask import Flask, current_app
from hashlib import md5
from config import UPLOAD_FOLDER
class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key = True)
    username = db.Column(db.String(64), index = True, unique = True)
    email = db.Column(db.String(128), index = True, unique = True, nullable = False)
    password_hash = db.Column(db.String(128), nullable = False)
    is_admin = db.Column(db.Boolean(), default = False)
    polls = db.relationship("Poll", backref = "author", lazy = "dynamic")
    votes = db.relationship("Votes", backref = "voter", lazy = "dynamic")

   def avatar(self, size):
      app = Flask(__name__)
      with app.app_context():
          upload_folder = UPLOAD_FOLDER  # please don't make normal variables UPPERCASE
          if(upload_folder):
             print("hooray")
          digest = md5(self.email.lower().encode("utf-8")).hexdigest()
          return(("https://www.gravatar.com/avatar/{}?d=retro&s={}").format(digest, size))