Настойка печенья - PullRequest
       2

Настойка печенья

0 голосов
/ 22 ноября 2018

Я пытаюсь установить куки во Flask, но не получаю то, что хочу.Вместо того, чтобы получить имя пользователя, я привязываю свой URL к своему URL.Мой rout.py

@app.route('/login', methods=['GET', 'POST'])
def login():
    if current_user.is_authenticated:
        return redirect(url_for('index'))
    form = LoginForm()
    if form.validate_on_submit():
        user = User.query.filter_by(username=form.username.data).first()
        if user is None or not user.check_password(form.password.data):
            flash('Invalid username or password')
            return redirect(url_for('login'))
        login_user(user, remember=form.remember_me.data)

        userCookie = request.form['username']
        resp = make_response(render_template('index.html'))
        resp.set_cookie('user', userCookie)
        next_page = request.args.get('next')
        if not next_page or url_parse(next_page).netloc != '':
            next_page = url_for('index', resp=resp)
        return redirect(next_page)
    return render_template('login.html', title='Sign In', form=form)

И я хочу отобразить содержимое cooki в index.html

{% for r in resp %}
  {{ r }}
{% endfor %}  

Вместо этого я получаю:

index?resp<Response+1250+bytes+[200+OK]>

Что я делаю не так?

[EDIT - метод выхода из системы]

Это мой метод перед добавлением файлов cookie

@app.route('/logout')
def logout():
  logout_user()
  return redirect(url_for('index'))

Итакесли я добавил файлы cookie:

@app.route('/logout')
def logout():
    resp = make_response(redirect('/login'))
    resp.delete_cookie('user')

И если я восстановлю сервер, войдите в систему, файл cookie будет создан, но после выхода из системы я могу даже перейти к конечной точке / возврату входа, соответственно

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Cookies устанавливаются в одном запросе и могут быть использованы в другом запросе.

Чтобы преодолеть это, используйте redirect в make_response.

Я приложил пример функций входа / выхода с использованием файлов cookie:

app.py:

from flask import Flask, render_template, request, make_response, flash, redirect

app = Flask(__name__)
app.config['SECRET_KEY'] = 'SUPER SECRET'

@app.route('/', methods = ['GET'])
def home():
    username = request.cookies.get('username')
    if username:
        return render_template('home.html', username=username)
    return render_template('home.html')

@app.route('/login', methods = ['GET','POST'])
def login():
    username = request.cookies.get('username')
    if username:
        return render_template('login.html', username=username)
    if request.method=='POST':
        username = request.form.get('username')
        password = request.form.get('password')
        if username=='admin' and password=='admin':
            flash("Successful login", "success")
            resp = make_response(redirect('/'))
            resp.set_cookie('username', username)
            return resp
        else:
            flash("Wrong username or password", "danger")
    return render_template('login.html')

@app.route('/logout', methods = ['GET'])
def logout():
    resp = make_response(redirect('/'))
    resp.delete_cookie('username')
    return resp
app.run(debug=True)

home.html:

<html>
    <head>
        <title>Home</title>
    </head>
    <body>
        {% with messages = get_flashed_messages() %}
          {% if messages %}
            <ul class=flashes>
            {% for message in messages %}
              <li>{{ message }}</li>
            {% endfor %}
            </ul>
          {% endif %}
        {% endwith %}
        {% if username %}
            Welcome {{ username }}. 
            <a href="{{ url_for('logout') }}">Click here</a> to logout.
        {% else %}
            You are not logged in.          
            <a href="{{ url_for('login') }}">Click here</a> to login.
        {% endif %}
    </body>
</html>

login.html:

<html>
    <head>
        <title>Login</title>
    </head>
    <body>
        {% with messages = get_flashed_messages() %}
          {% if messages %}
            <ul class=flashes>
            {% for message in messages %}
              <li>{{ message }}</li>
            {% endfor %}
            </ul>
          {% endif %}
        {% endwith %}

        {% if username %}
            You are already logged in as{{ username }}.
            <a href="{{ url_for('home') }}">Click here</a> to go to home.
            <a href="{{ url_for('logout') }}">Click here</a> to logout.
        {% else %}
            <form method="post" action="">
                <label for="username">Username</label>
                <input type="text" name="username" id="username"/> 
                <br/>

                <label for="password">Password</label>
                <input type="password" name="password" id="password"/> 
                <br/>

                <input type="submit" name="submit" id="submit" value="Login"/> 
            </form>
        {% endif %}
    </body>
</html>

Скриншоты:

1.Перед входом в систему (без cookie):

before login

2.Логин (без cookie):

login

3.После входа в систему (полученный cookie):

after login

4.После выхода из системы (без файла cookie):

after logout

0 голосов
/ 22 ноября 2018

Вам необходимо вернуть соответственно напрямую, make_response Преобразовать возвращаемое значение из функции представления в экземпляр response_class.

userCookie = request.form['username']
resp = make_response(render_template('index.html'))
resp.set_cookie('user', userCookie)
next_page = request.args.get('next')
if not next_page or url_parse(next_page).netloc != '':
    return resp

В html получить cookie с помощью javascript

<label id="label_id1"></label>

<script type="text/javascript">
    alert(document.cookie);
    document.getElementById('label_id1').innerhtml = document.cookie
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...