跟着一个教程看了几天才让这个程序正常运行,并实现用户登录、注销和增添文章。连接的是SQLite数据库,程序看起来比较易懂。但是有的需要注意的点不知道的话,再苦思冥想也没用。还是要好好看着教程一步一步来最好。
代码和解释如下:
程序的结构是这样
1.st——main.py (定义路由进行后端处理、运行程序的入口)
from flask import Flask,request,render_template,redirect,url_for
from config import DevConfig
from flask.ext.sqlalchemy import SQLAlchemy
from flask import request,render_template,flash,abort,url_for,redirect,session,Flask,g
app=Flask(__name__)
db=SQLAlchemy(app)
app.config.from_object(DevConfig )
app.config['SECRET_KEY'] = '\xaf\xd48\xbd7\xb49\xa8\x86\x8b\x1fL\xc9\x1eB\xa8\xa17a\xcf96\xfe\xa3'
class User(db.Model):
id=db.Column(db.Integer(),primary_key= True)
username=db.Column (db.String(255))
password=db.Column (db.String(255))
posts = db.relationship(
'Post',
backref='user',
lazy='dynamic'
)
def __init__(self,id,username,password):
self.username=username
self.password=password
def __repr__(self):
return "<User '{}'>".format(self.username)
class Post(db.Model):
id = db.Column(db.Integer(), primary_key=True)
title=db.Column(db.String(255))
text=db.Column(db.String(255))
publish_date=db.Column(db.DateTime())
user_id=db.Column(db.Integer(),db.ForeignKey ('user.id'))
def __init__(self,title,text):
self.title=title
self.text=text
def __repr__(self):
return "<Post '{}'>".format(self.title,self.text)
@app.route('/')
def show_entries():
user=User.query.get(2)
posts =user.posts.all()
return render_template('show_entries.html', posts=posts,user=user)
@app.route('/add', methods=['POST'])
def add_entry():
if not session.get('logged_in'):
abort(401)
title = request.form['title']
text = request.form['text']
new_post = Post(title,text)
new_post.user_id=user.id
db.session.add(new_post)
db.session.commit()
flash('New entry was successfully posted')
return redirect(url_for('show_entries'))
@app.route('/login', methods=['GET', 'POST'])
def login():
error = None
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
user = User.query.filter_by(username=request.form['username']).first()
passwd = User.query.filter_by(password=request.form['password']).first()
if user is None:
error = 'Invalid username'
return render_template('login.html', error=error)
elif passwd is None:
error = 'Invalid password'
return render_template('login.html', error=error)
else:
session['logged_in'] = True
flash('You were logged in')
return redirect(url_for('show_entries'))
return render_template('login.html', error=error)
@app.route('/logout')
def logout():
session.pop('logged_in', None)
flash('You were logged out')
return redirect(url_for('show_entries'))
if __name__ == '__main__':
app.run()
在这部分遇到的一个问题一直没找出来,看了很久。
程序一运行碰到session就出错,我本来以为session就是一个可以设置全局变量的东西,不需要别的配置什么的。
后来百度得知 要想让session实现对话,就要配置一个’SECRET_KEY’
app.config['SECRET_KEY'] = '\xaf\xd48\xbd7\xb49\xa8\x86\x8b\x1fL\xc9\x1eB\xa8\xa17a\xcf96\xfe\xa3'
在这里我用的是命令行随意生成的一个密钥
>>>import os
>>>os.urandom(24)
2.nd——config.py (连接SQLite数据库的配置文件)

3.rd——layout.py (注销用户、同时作为一个基模板让每一个用户已经登录的页面都可以实现注销功能)

url_for 可以让程序转到main.py中的login函数,然后显示出登陆的界面,并在函数中进行数据处理
4.th——show_entries.py (判断为登录状态便可以让用户增加文章、显示所有文章)

session.logged_in 是用来判断用户是否为登录状态,如果为登录状态就可以实现增加文章的功能。
5.th——manager.py(通过命令行运行开发环境服务器)

make_shell_context函数会创建一个python命令行,并且在应用上下文中执行。返回的字典告诉flask—script在打开命令行时进行一些默认的导入工作。
效果图:
这个程序很多功能都不完善。我数据库存了两个用户,这个是显示的我第二个用户所有文章。也是程序运行看到的第一个页面。
这个页面是实现了登录我第二个用户后,能看到的增加文章的功能页面。
这个是我新增一篇文章后显示的所有文章,可以看到这个功能的实现。