快速玩Flask框架,爲微博作些準備html
from flask importFlask, render_template, session, redirect, url_for, flash
from flask_bootstrap importBootstrap
from flask_moment importMoment
from datetime import datetime
from flask_wtf importForm
from wtforms importStringField,SubmitField
from wtforms.validators importRequired
from flask_sqlalchemy importSQLAlchemy
from flask_script importManager
import os
basedir = os.path.abspath(os.path.dirname(__file__))
app =Flask(__name__)
#wtf表單驗證
app.config['SECRET_KEY']='hard to guess string'
#數據庫URL
app.config['SQLALCHEMY_DATABASE_URI']= \
'sqlite:///'+ os.path.join(basedir,'data.sqlite')
#每次請求結束後自動提交數據變更
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN']=True
bootstrap =Bootstrap(app)
moment =Moment(app)
db =SQLAlchemy(app)
manager =Manager(app)
#wtf表單類
classNameForm(Form):
name =StringField('What is your name?', validators=[Required()])
submit =SubmitField('Submit')
#數據庫中的table類
classRole(db.Model):
__tablename__ ='roles'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
users = db.relationship('User', backref='role', lazy='dynamic')
def __repr__(self):
return'<Role %r>'% self.name
classUser(db.Model):
__tablename__ ='users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), unique=True, index=True)
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
def __repr__(self):
return'<User %r>'% self.username
#主頁
@app.route('/', methods=['GET','POST'])
def index():
form =NameForm()
if form.validate_on_submit():
user =User.query.filter_by(username=form.name.data).first()
if user isNone:
user =User(username=form.name.data)
db.session.add(user)
session['known']=False
else:
session['known']=True
session['name']= form.name.data
form.name.data =''
return redirect(url_for('index'))
return render_template('user.html', form=form, name=session.get('name'), known=session.get('known',False),
current_time=datetime.utcnow())
#404頁
@app.errorhandler(404)
def page_not_found(e):
return render_template('404.html'),404
#500頁
@app.errorhandler(500)
def internal_server_error(e):
return render_template('500.html'),500
#manager.run() 用因而服務器在命令行運行
if __name__ =='__main__':
app.run(debug=True)
# manager.run()
<!-- 基於bootstrap/base.html的基模板 默認有導航欄 page——content可重寫-->
{% extends "bootstrap/base.html" %}
<!-- 導入moment.js -->
{% block scripts %}
{{ super() }}
{{ moment.include_moment() }}
{% endblock %}
{% block title %}Flasky{% endblock %}
{% block head %}
{{ super() }}
<linkrel="shortcut icon"href="{{ url_for('static', filename = 'favicon.ico') }}"
type="image/x-icon">
<linkrel="icon"href="{{ url_for('static', filename = 'favicon.ico') }}"
type="image/x-icon">
{% endblock %}
{% block navbar %}
<divclass="navbar navbar-inverse"role="navigation">
<divclass="container">
<divclass="navbar-header">
<buttontype="button"class="navbar-toggle"
data-toggle="collapse"data-target=".navbar-collapse">
<spanclass="sr-only">Toggle navigation</span>
<spanclass="icon-bar"></span>
<spanclass="icon-bar"></span>
<spanclass="icon-bar"></span>
</button>
<aclass="navbar-brand"href="/">Flasky</a>
</div>
<divclass="navbar-collapse collapse">
<ulclass="nav navbar-nav">
<li><ahref="/">Home</a></li>
</ul>
</div>
</div>
</div>
{% endblock %}
{% block content %}
<!-- 彈出警告信息-->
<divclass="container">
{% for message in get_flashed_messages() %}
<divclass="alert alert-warning">
<buttontype="button"class="close"data-dismiss="alert">×</button>
{{ message }}
</div>
{% endfor %}
{% block page_content %}{% endblock %}
</div>
{% endblock %}
<!DOCTYPE html>
{% extends "base.html" %}
{% block title %}Flasky - Page Not Found{% endblock %}
{% block page_content %}
<divclass="page-header">
<h1>Not Found</h1>
</div>
{% endblock %}