2015-11-03 49 views
1

在我的make_session函数中,如果表单中的密码与某些凭证不匹配,则它返回一个字符串,最终将其存储为名为session的cookie。在我的索引文件中,我将它设置为index.html,如果cookie值为{},它会要求输入登录信息。如果我通过用任何整数替换“无效”来更改make_session函数返回的内容,则代码将按预期工作。如果cookie值是一个字符串,但值不是int值,则值错误

一个坏的解决我的问题是回到我等于{} get_saved_data功能设置数据之前加

except: 
    data = {} 

但如果我在我的浏览器没有cookie此结束了相同的结果在这里,但它摆脱了我的错误:https://gist.github.com/anonymous/e101aa46f154a075b038

我怀疑get_saved_data函数可能是一个错误。

地图我的目录:

      |---- layout.html 
         |---- index.html 
     |--- templates -| 
Project -| 
     |--- test.py 

test.py:

from flask import Flask, render_template, redirect, url_for, request, make_response 
import json 

def get_saved_data(key): 
    try: 
     data = json.loads(request.cookies.get(key)) 
    except TypeError: 
     data = {} 
    return data 


def make_session(form_data): 
    if form_data.get('username') == "username" and form_data.get('password') == "password": 
     return "12345" 
    else: 
     return "invalid" 


app = Flask(__name__) 


@app.route('/') 
def index(): 
    data = get_saved_data("session") 
    return render_template('index.html', saves=data) 


@app.route('/login', methods=['POST']) 
def login(): 
    response = make_response(redirect(url_for('index'))) 
    response.set_cookie("session", make_session(dict(request.form.items()))) 
    return response 

app.run(debug=True, host='0.0.0.0', port=8000) 

的index.html:

{% extends "layout.html" %} 

{% block content %} 
    {% if saves == {}: %} 
     <p>Please log in.</p> 
    {% else: %} 
     <p>Your Session value is: {{ saves }}</p> 
    {% endif %} 
    {% if saves == {}: %} 
     <form action="{{ url_for('login') }}" method="POST"> 
      <p>We take your private information very seriously. All data is encrypted not once but twice! in ROT13 to provide the best security.</p><br /> 
      <label for="username">Please enter your username:</label> 
      <input type="text" name="username" /><br /> 
      <label for="password">Please enter your password:</label> 
      <input type="text" name="password" /><br /> 
      <button class="btn">Log In</button> 
     </form> 
    {% endif %} 
{% endblock %} 

的layout.html:

<!DOCTYPE html> 
<html> 
    <head> 
     <title>Character Generator</title> 
    </head> 
    <body> 
     {% block content %}{% endblock %} 
    </body> 
</html> 

回答

1

将您的get_saved_data更改为以下会有什么区别?

def get_saved_data(key): 
    data = json.loads(request.cookies.get(key, '{}')) 
    return data 

返回'{}'如果没有这样的键,请确保json不会抱怨任何东西。

0

虽然我还没找到一种方法来直接解决问题,并且使用lord63.j的答案为我节省了几行代码,但间接解决此问题的一种方法是通过修改将cookie值保存为字典登录功能,以这样的:

@app.route('/login', methods=['POST']) 
def login(): 
    response = make_response(redirect(url_for('index'))) 
    response.set_cookie("data", json.dumps({"session": make_session(dict(request.form.items()))})) 
    return response 

从它们,以访问会话值我需要使用

saves.get('session') 

为节省相当于

json.loads(request.cookies.get('data', '{}')) 

索引函数

@app.route('/') 
def index(): 
    data = get_saved_data("data") 
    return render_template('index.html', saves=data) 
相关问题