2012-11-10 47 views
1

我在学习如何用Python构建一个基本的Flask应用程序。我首先遵循他们的优秀教程来制作一个简单的博客。本教程将从flask导入session。这后来被设置为“登录”,只有当它是这样的用户可以写帖子。例如,登录功能如下:如何使用Flask-SQLAlchemy在Flask中将Python设置为“登录”?

@app.route('/login', methods=['GET', 'POST']) 
def login(): 
    error = None 
    if request.method == 'POST': 
     if request.form['username'] != app.config['USERNAME']: 
      error = 'Invalid username' 
     elif request.form['password'] != app.config['PASSWORD']: 
      error = 'Invalid password' 
     else: 
      session['logged_in'] = True 
      flash('You were logged in') 
      return redirect(url_for('show_entries')) 
    return render_template('login.html', error=error) 

再后来,另一个函数检查会话是否确实在“LOGGED_IN”:

@app.route('/add', methods=['GET', 'POST']) 
def add_entry(): 
    if not session.get('logged_in'): 
     abort(401) 
    g.db.execute('insert into entries (title, text) values (?, ?)', 
       [request.form['title'], request.form['text']]) 
    g.db.commit() 
    flash('New entry was successfully posted') 
    return redirect(url_for('show_entries')) 

当我尝试做这在我的应用程序,不过,我得到500 Internal Server Error:

内部服务器错误

的SERV呃遇到了一个内部错误,无法完成您的请求 。服务器超载或在应用程序中出现错误 。

我认为这是因为在教程中使用了sqlite数据库,而我在使用Flask-SQLAlchemy时遇到了错误。这可能是问题的根源吗?如果是这样,是否有推荐的方法来做类似的工作?也就是说,允许应用程序检查是否有人登录?

下面是我的全部代码:

from flask import Flask, request, session, redirect, url_for, render_template 
from flask.ext.sqlalchemy import SQLAlchemy 



app = Flask(__name__) 
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/z.db' 
DEBUG = True 
db = SQLAlchemy(app) 

class User(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    username = db.Column(db.String(80), unique=True) 
    email = db.Column(db.String(120), unique=True) 
    password = db.Column(db.String(160), unique=True) 

    def __init__(self, username, email, password): 
     self.username = username 
     self.email = email 
     self.password = password 

    def __repr__(self): 
     return '<User %r>' % self.username 

@app.route('/', methods=['GET', 'POST']) 
def home(): 
    #check to see if logged in 
    if session['logged_in'] == True: 
     note = "this text is displayed because you are logged in."    
    note=None 
    if request.method == 'POST': 
     new_user = User(request.form['username'], request.form['email'], request.form['password']) 
     #before making the new user, check to make sure the entered information isn't already in the db 
     if User.query.filter_by(username=request.form['username']).first() != None: 
      note = "sorry, this username has already been taken" 
     elif User.query.filter_by(email=request.form['email']).first() != None : 
      note = "sorry, this email address is already associated with an account." 
     else: 
      db.session.add(new_user) 
      db.session.commit() 
      session['logged_in'] = True 
      redirect(url_for('home')) 
    return render_template('index.html', note=note) 

@app.route('/login', methods=['GET', 'POST']) 
def signin(): 
    note=None 
    if request.method == 'POST': 
     #get username and search for it in db 
     tag = request.form['username'] 
     #if the entry contains '@', search db as email address 
     if tag.find('@') != -1: 
      user = User.query.filter_by(email=tag).first() 
     else: 
      user = User.query.filter_by(username=tag).first() 
     #if user exists, get password associated with it 
     if user != None: 
      password = user.password 

      #see if db email equals email input in HTML 
      if password == request.form['password']: 
       session['logged_in'] = True 
       return redirect(url_for('home')) 
      else: 
       note='wrong password' 
     else: 
      #call an error message 
      note='this username does not seem to exist. that is all i know' 
    return render_template('login.html', note=note)   

if __name__ == '__main__': 
    app.run()   

提前非常感谢。

+0

什么(如果有的话)是服务器上记录的错误?检查您的服务器日志以查找完整的回溯。 –

+0

令我惊讶的是没有回溯。内部错误只显示在浏览器中。我在我的Python代码的顶部有'DEBUG = True'',但是有什么我应该放在我的代码中显示潜在的错误? – zch

+0

您的服务器是否没有错误日志?内部错误将被记录在某处*。 –

回答

2

您需要设置app.secret_key能够使用会话:

除了请求对象也有称为会话的第二个目的,它允许你存储从一个请求到特定的用户信息下一个。这是在您的cookie之上实现的,并以加密方式签署cookie。这意味着用户可以查看cookie的内容,但不能修改它,除非他们知道用于签名的密钥。

为了使用会话您必须设置密钥。 Here is how sessions work

+0

刚刚得到它正常工作。谢谢! – zch

相关问题