добавление аватарки в базу на Flask - PullRequest
0 голосов
/ 02 августа 2020

Есть регистрационная форма. Как добавить фото профиля в базу и сразу получить обратно. Я знаю, что это возможно с помощью 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 %}

1 Ответ

0 голосов
/ 02 августа 2020

Итак, когда вы говорите, верните его немедленно, я предполагаю, основываясь на вашем коде, вы имеете в виду, что после того, как они зарегистрировали свою учетную запись, вы перенаправляете их на страницу их профиля, и когда они перенаправляют, их изображение должно появиться при первом посещении и им не нужно обновлять sh или ждать некоторое время, прежде чем изображение станет доступным. Если я ошибаюсь, исправьте эту информацию в своем вопросе.

Итак, у вас есть несколько вещей, которые вам нужно сделать здесь.

A. Как вы будете хранить эти картинки. Есть два (более простых) способа сделать это.

  1. Сохранение двоичных данных изображения в вашей базе данных с типом столбца blob

  2. Сохранение изображения с длинным случайным именем, чтобы избежать конфликтов на жестком диске, где вы храните файлы c, затем сохраните случайное имя этого изображения и ссылку, к какому пользователю оно принадлежит в базе данных. Этот вариант, безусловно, самый простой, когда вы переходите к следующему разделу

B. В зависимости от того, какой из них вы сделали, вам теперь нужно получить изображение, когда они переходят к своему профилю

  1. Когда они переходят к своему профилю, вы должны добавить URL-адрес конечной точки на вашем sever, у которого есть способ передать нужное вам изображение пользователя. Затем извлекают двоичные данные из базы данных и возвращают эти данные в виде файла.

  2. Когда они переходят в свой профиль, получают их идентификатор пользователя. Выполните запрос к базе данных, в которой находится изображение профиля этого пользователя, и возьмите сгенерированное вами случайное имя. Поскольку этот файл сохраняется в папке файлов stati c, вы можете просто добавить URL-адрес папки stati c с этим случайным именем, добавленным в конец. Например, этот URL-адрес может выглядеть так: https://example.com/static/somerandomlongnameforthispicture.jpg

http очень простой / строгий в отношении того, как данные могут быть получены с сервера. Теперь, если вы хотите использовать ajax для этого, поскольку они уже находятся на странице своего профиля, и они обновили свое изображение, и вы хотите немедленно показать это обновление, тогда logi c, который я объясняю для хранения файла, такой же но вам нужно будет обновить URL-адрес для тега <img>, который есть в вашем html, чтобы он указывал на имя файла, которое ваш сервер создает для этого нового изображения. Или просто принудительно обновите sh и позвольте шаблону на стороне сервера обработать обновление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...