【问题标题】:adding profile picture to database on Flask将个人资料图片添加到 Flask 上的数据库
【发布时间】:2020-08-02 15:49:39
【问题描述】:

有一个注册表。如何将个人资料图片添加到数据库并立即取回。我知道AJAX 是可能的,但我不知道如何实现它。我可以使用BLOB 类型将图像名称发送到数据库,但无法在个人资料页面上打印我的图像。有什么问题?

Registration code:

from flask_mysqldb import MySQL
import MySQLdb.cursors

UPLOAD_FOLDER = 'static/uploads/'

@app.route('/register', methods=['GET', 'POST'])
def register():
    if request.method == 'POST':
        firstname = request.form['firstname']
        lastname = request.form['lastname']
        email = request.form['email']
        filenames = request.files['files']

    uploaded_files = request.files.getlist("file[]")
    filenames = []
    for file in uploaded_files:
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            file.save(os.path.join(app.config['UPLOAD_FOLDER'],filename))
            filenames.append(filename)
        cur = mysql.connection.cursor()
        cur.execute('INSERT INTO users.data(filename) VALUES (%s)',(filename))
    # This line is essential, store the data in session
    session['filenames'] = filenames

        cur = mysql.connection.cursor()
        session['email'] = email
        session['firstname'] = firstname
        cur.execute('INSERT INTO users.data(firstname, lastname, email) VALUES (%s, %s, %s)', (firstname, lastname, email))
        mysql.connection.commit()
        cur.close()
        return redirect(url_for('profile'))

profile.html:

@app.route('/profile', methods=['GET'])
def profile():
    if request.method == 'GET':
        return render_template('profile.html', data=data, filenames=filenames)

register.html:

<input type="firstname" name="firstname" placeholder="Firstname">
<input type="lastname" name="lastname" placeholder="Lastname">
<input type="email" name="email" placeholder="First name">
<input type='file' name="files" id="uploadPDF">
<button>Register</button>

profile.html:

<h2>Welcome, {{ firstname }}</h2>

{% for file in filenames %}
  <h1>{{ file }}</h1>
{% endfor %}

【问题讨论】:

    标签: python mysql python-3.x flask


    【解决方案1】:

    因此,当您说立即取回时,我假设根据您的代码,您的意思是,在他们注册帐户后,您将他们重定向到他们的个人资料页面,当他们被重定向时,他们的图片应该在第一次访问时显示,并且他们不必刷新或必须等待一段时间才能获得图片。如果我错了,请更正您问题中的信息。

    所以你有很多事情需要在这里做。

    A.你将如何存储这些图片。有两种(更简单的)方法可以做到这一点。

    1. 使用 blob 列类型将图片的二进制数据存储到数据库中

    2. 使用长随机名称保存图片以避免与存储静态文件的硬盘发生冲突,然后将该图片的随机名称及其所属用户的引用保存在数据库中。 当您进入下一部分时,此选项是迄今为止最简单的方法

    B.当他们导航到他们的个人资料时,您现在必须根据您所做的其中一个来检索图像

    1. 当他们导航到他们的个人资料时,您必须将 url 添加到服务器上的端点,该端点可以通过某种方式传递您需要的用户图片。然后从数据库中获取二进制数据并将该数据作为文件返回。

    2. 当他们导航到他们的个人资料时,获取他们的用户 ID。查询该用户的个人资料图片的数据库并获取您生成的随机名称。由于此文件保存在您的静态文件文件夹中,您只需添加静态文件夹 url,并在末尾附加随机名称。例如,该网址可能看起来像这样https://example.com/static/somerandomlongnameforthispicture.jpg

    http 对于如何从服务器检索事物非常基本/严格。现在,如果您想为此使用 ajax,因为他们已经在他们的个人资料页面上并且他们更新了他们的图片,并且您想立即显示该更新,那么我解释的存储文件的逻辑是相同的,但您必须更新您在 html 中的 &lt;img&gt; 标记的 url,以指向您的服务器为该新图片创建的文件名。或者只是强制刷新,让您的服务器端模板处理更新。

    【讨论】:

    • 是的,你理解正确,但我不知道如何为这个问题编写代码。
    • 您能再检查一下问题吗?我已经更新了
    • 该代码是一个很好的开始。我不能说我以前见过有人在会话变量中保存文件名,但据我所知,只要它不是文件的整个路径,就不应该有任何安全问题。但是我猜它没有显示实际图像,而只是图像的名称正确吗?如果您只是原型设计,那很好。当需要显示图像时,请确保使用 url 函数来获取静态文件。到目前为止,就为这个问题编写代码而言,你做得很好。坚持下去。
    • 还要确保将 secure_filename 保存在数据库中的某个位置,并将用户 ID 链接到该文件。例如,如果该人注销并且会话被破坏,那么当他们重新登录时如何为他们获取个人资料图像?只是一个值得思考的有用场景。
    • 交易是代码不起作用。我不明白为什么(
    猜你喜欢
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多