Как создать отдельную страницу результатов с помощью Flask?

#python #flask

Вопрос:

Я пытаюсь создать небольшое многостраничное веб-приложение с помощью flask. До сих пор мое приложение состоит из двух отдельных маршрутов. Первый маршрут отображает небольшую веб-форму, которая запускает запрос api, который генерирует данные, уникальные для каждого пользователя и сеанса. Данные поставляются с уникальным идентификатором для каждого ответа api. Второй маршрут используется для отображения уникальных результатов для каждого пользователя. Как я могу создать отдельную страницу результатов для каждого пользователя, которая является потокобезопасной и гарантирует, что данные не будут доступны другим пользователям?

Псевдокод:

 from flask import Flask, render_template, redirect 

app = Flask(__name__)

# A simple webform 
@app.route('/', methods=['GET', 'POST'])
def view_form(): 
 
  if request.method == "POST":
    
    # Validate form and perform api request
    
    return redirect(url_for('view_results'))

  return render_template('main.html')

# Results page
@app.route('/results', methods=['GET'])
def view_results():

  # Show an individual results page
  
  return render_template('results.html')

 

Ответ №1:

Этот вопрос очень широк. Вот несколько способов, как это реализовать.

Более близкий пример будет выглядеть так:

 from flask import Flask, render_template, redirect 
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def view_form(): 
 
  if request.method == "POST":

    # get user id to be able redirect to specific results page
    user_id = request.form.get('user_id')
    
    # redirect to page for exact user_id
    return redirect(url_for('view_results/'   user_id))

  return render_template('main.html')

@app.route('/results/<user_id>', methods=['GET'])
def view_results(user_id=None):

  # Show an individual results according user_id
  if user_id == 'blahblah':
    return render_template('results_for_blahblah.html')
  
  # if user_id is None return a standard dummy results
  return render_template('results.html')
 
  1. Получить user_id данные из формы запроса
  2. Перенаправление на новый URL-адрес с user_id параметром запроса
  3. Ответьте на специально созданный шаблон для конкретного пользователя с помощью user_id

Комментарии:

1. Спасибо вам за ваш ответ. Я заменил url_for('view_results/' user_id) на url_for('view_results', user_id = user_id) , и это работает нормально.

2. Приведенный выше код доверяет вводу пользователя. Таким образом, пользователь, вошедший в систему с идентификатором пользователя=1, может сфабриковать запрос с идентификатором пользователя=2 в качестве входных данных и украсть информацию пользователя с идентификатором пользователя=2.

3. @branco Я только что ответил на точный вопрос. Это не руководство по эксплуатации колбы. Аспекты входа в систему, сеанса и безопасности выходят за рамки. Но, да, этот пример небезопасен и не должен содержать личные и конфиденциальные данные.

4. @branco спасибо вам за ваш ответ. В моем примере пользователи фактически уже вошли в систему. Идентификатор, который я использую, исходит из самого api, а не из пользовательского ввода. Он используется только для разделения уникальных запросов, которые не содержат конфиденциальной или личной информации, но информацию, которая, тем не менее, должна храниться отдельно для каждого пользователя.

Ответ №2:

Чтобы обеспечить некоторую безопасность в работе вашего приложения с пользователями и их сеансами, вам следует заглянуть в плагин flask Flask-Login.

Я рекомендую вам также ознакомиться с Мега-учебником по колбе Мигеля Гринберга и руководствами OWASP.

Кроме того, в принципе, никогда не доверяйте вводу пользователя, как это делает ответ rzlvmp. Это может быть сфабриковано для кражи чужих личных данных с вашего сайта.