文件目录:
run.py
from app import app
第一个app是文件夹app,第二个app是__init__文件
_init_.py
from flask import Flask
app=Flask(__name__)
app.config.from_object('config')
from app import view
app.run(debug=True)
我们引入了Flask,并且在导入view.py之前先引入了config.py,并且绑定在了app.config上
view.py
from flask import render_template, flash, redirect
from app import app
from .forms import LoginForm#导入form.py
# index view function suppressed for brevity
@app.route('/login', methods = ['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():#一句话就可以完成所有的表单验证,比如有没有填写对信息
flash('Login requested for OpenID="' + str(form.openid.data) + '", remember_me=' + str(form.remember_me.data))
return redirect('/index')
return render_template('login.html',
title = 'Sign In',
form = form,
providers=app.config['OPENID_PROVIDERS'])#providers=app.config['OPENID_PROVIDERS']
因为一开始的表单的openid一直是空着的,所以form.valdita_on_submit会返回false,所以会render_template('login.html')
forms.py
from flask_wtf import FlaskForm
from wtforms import StringField,BooleanField
from wtforms.validators import DataRequired,EqualTo
class LoginForm(FlaskForm):
openid=StringField('openid',validators=[DataRequired()])#Datarequired()确保字段中有数据
remember_me=BooleanField('remember_me',default=True)
LoginForm类就是来创建表单的,StringField是创建文本输入,BooleanField是创建勾选框
config.py
CSRF_ENABLED = True
SECRET_KEY = 'you-will-never-guess'
OPENID_PROVIDERS = [
{ 'name': 'Google', 'url': 'https://www.google.com/accounts/o8/id' },
{ 'name': 'Yahoo', 'url': 'https://me.yahoo.com' },
{ 'name': 'AOL', 'url': 'http://openid.aol.com/<username>' },
{ 'name': 'Flickr', 'url': 'http://www.flickr.com/<username>' },
{ 'name': 'MyOpenID', 'url': 'https://www.myopenid.com' }]
config.py就是一些配置参数
base.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
{% if title %}
<title>{{title}} - microblog</title>
{% else %}
<title>microblog</title>
{% endif %}
</head>
<body>
<div>Microblog: <a href="/index">Home</a></div>
<hr>
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul>
{% for message in messages %}
<li>{{ message }} </li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
{% block content %}{% endblock %}
</body>
</html>
模板html,主要是用来在网页中显示报错信息,注意get_flashed_message()函数是用来接收错误信息的
login.html
<!-- extend from base layout -->
{% extends "base.html" %}
{% block content %}
<script type="text/javascript">
function set_openid(openid,pr){
u=openid.search('<username>')
if(u!=-1){
user=prompt('Enter your '+pr+'username:')
openid=openid.substr(0,u)+user
}
form=document.forms['login'];//获取<form name="login">
form.elements['openid'].value=openid
}
</script>
<h1>Sign In</h1>
<form action="" method="post" name="login">
{{form.csrf_token()}}
{{form.hidden_tag()}}
<p>
Please enter your OpenID:<br>
{{form.openid(size=80)}}<br>
{% for error in form.openid.errors %}
<span style="color: red;">[{{ error }}]</span>
{% endfor %}<br>
|{% for pr in providers %}
<a href="javascript:set_openid('{{ pr.url }}', '{{ pr.name }}');">{{ pr.name }}</a> |
{% endfor %}
</p>
<p>{{form.remember_me}} Remember Me</p>
<p><input type="submit" value="Sign In"></p>
</form>
{% endblock %}
{{forms.openid(size=80)}}规定了输入框的数字大小