Flask
一、环境搭建与项目创建
1、安装
pip install flask
2、项目创建
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
3、运行项目
python hello.py
app.run()
二、Flask基础知识
1、Flask 路由
from flask import Flask
app = Flask(__name__)
如果访问/,浏览器返回“Index Page”
@app.route('/')
def index():
return 'Index Page'
如果访问/hello,浏览器返回“Hello,World”
@app.route('/hello')
def hello():
return 'Hello, World'
if __name__ ="__main__":
app.run()
2、变量规则
@app.route('/user/<username>')
def show_user_profile(username):
#显示用户名
return 'User {}'.format(username)
@app.route('/post/<int:post_id>')
def show_post(post_id):
#显示提交整型的用户"id"的结果,注意"int"是将输入的字符串形式转换为整型数据
return 'Post {}'.format(post_id)
@app.route('/path/<path:subpath>')
def show_subpath(subpath):
#显示 /path/ 之后的路径名
return 'Subpath {}'.format(subpath)
3、唯一的URL /重定向行为
Flask的URL规则基于Werkzeug的路由模块。这确保形成的URL是唯一的,并且基于Apache规定的先例。
from flask import Flask
app = Flask(__name__)
@app.route('/python')
def hello_flask():
return 'Hello Flask'
或者
@app.route('/python/')
def hello_python():
return 'Hello Python'
if __name__ == '__main__':
app.run()
4、Flask URL构建
from flask import Flask, redirect, url_for
app = Flask(__name__)
@app.route('/admin')
def hello_admin():
return 'Hello Admin'
@app.route('/guest/<guest>')
def hello_guest(guest):
return 'Hello {} as Guest'.format(guest)
@app.route('/user/<name>')
def hello_user(name):
if name =='admin':
return redirect(url_for('hello_admin'))
else:
return redirect(url_for('hello_guest',guest = name))
if __name__ == '__main__':
app.run(debug = True)
5、Flask HTTP方法
from flask import Flask, redirect, url_for, request
app = Flask(__name__)
@app.route('/success/<name>')
def success(name):
return 'welcome {}'.format(name)
@app.route('/login',methods = ['POST', 'GET'])
def login():
if request.method == 'POST':
user = request.form['nm']
return redirect(url_for('success',name = user))
else:
user = request.args.get('nm')
return redirect(url_for('success',name = user))
if __name__ == '__main__':
app.run(debug = True)
6、Flask 模板
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template(‘index.html’)
if __name__ == '__main__':
app.run(debug = True)
7、Flask 请求对象
@app.route('/login', methods=['POST', 'GET'])
def login():
error = None
if request.method == 'POST':
if valid_login(request.form['username'],
request.form['password']):
return log_the_user_in(request.form['username'])
else:
error = 'Invalid username/password'
# 当请求形式为“GET”或者认证失败则执行以下代码
return render_template('login.html', error=error)
8、文件上传
from flask import Flask, render_template, request
from werkzeug import secure_filename
app = Flask(__name__)
@app.route('/upload')
def upload_file():
return render_template('upload.html')
@app.route('/uploader', methods = ['GET', 'POST'])
def upload_file():
if request.method == 'POST':
f = request.files['file']
f.save(secure_filename(f.filename))
return 'file uploaded successfully'
if __name__ == '__main__':
app.run(debug = True)
9、Flask 将表单数据发送到模板
from flask import Flask, render_template, request
app = Flask(__name__)
@app.route('/')
def student():
return render_template('student.html')
@app.route('/result',methods = ['POST', 'GET'])
def result():
if request.method == 'POST':
result = request.form
return render_template("result.html",result = result)
if __name__ == '__main__':
app.run(debug = True)
10、Flask Cookies
from flask import Flask,render_template,request,make_response
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/setcookie', methods = ['POST', 'GET'])
def setcookie():
if request.method == 'POST':
user = request.form['nm']
resp = make_response(render_template('readcookie.html'))
resp.set_cookie('userID', user)
return resp
@app.route('/getcookie')
def getcookie():
name = request.cookies.get('userID')
return '<h1>welcome '+name+'</h1>'
if __name__ == "__main__":
app.run(debug=True)
11、Flask Sessions(会话)
$ python3 -c 'import os; print(os.urandom(16))'
b'm \xf8>]?\x86\xcf/y\x0e\xc5\xc7j\xc5/'
Session[key] = value
session.pop(key, None)
cookie和session的区别:
1,cookie的数据存放在客户的浏览器上,会话数据放在服务器上。
2,cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用会话。
3,session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用COOKIE。
4,单个的cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个的cookie。
5,所以个人建议:
将登陆信息等重要信息存放为SESSION
其他信息如果需要保留,可以放在COOKIE中
会话是客户端登录到服务器并注销服务器的时间间隔。需要在该会话中保存的数据会存储在服务器上的临时目录中。会为每个客户端的会话分配会话ID。
会话(session)是在cookies的基础上实现的,并且在cookies中使用加密的签名。这意味着用户可以查看cookie的内容,但是不能修改它,除非知道签名的密钥。要使用会话,你需要设置一个密钥。会话数据存储在饼干的顶部,服务器以加密方式对其进行签名。对于此加密,瓶应用程序需要一个定义的SECRET_KEY(密钥)。
12、Flask 重定向和错误
Flask.redirect(location, statuscode, response)
location参数是应该重定向响应的URL。
statuscode发送到浏览器标头,默认为302。
response参数用于实例化响应。
from flask import Flask, redirect, url_for, render_template, request
# Initialize the Flask application
app = Flask(__name__)
@app.route('/')
def index():
return render_template('log_in.html')
@app.route('/login',methods = ['POST', 'GET'])
def login():
if request.method == 'POST' and
request.form['username'] == 'admin' :
return redirect(url_for('success'))
return redirect(url_for('index'))
@app.route('/success')
def success():
return 'logged in successfully'
if __name__ == '__main__':
app.run(debug = True)
from flask import Flask, redirect, url_for, render_template, request, abort
app = Flask(__name__)
@app.route('/')
def index():
return render_template('log_in.html')
@app.route('/login',methods = ['POST', 'GET'])
def login():
if request.method == 'POST':
if request.form['username'] == 'admin' :
return redirect(url_for('success'))
else:
abort(401)
else:
return redirect(url_for('index'))
@app.route('/success')
def success():
return 'logged in successfully'
if __name__ == '__main__':
app.run(debug = True)
13、Flask 响应
@app.errorhandler(404)
def not_found(error):
resp = make_response(render_template('error.html'), 404)
resp.headers['X-Something'] = 'A value'
return resp
14、Flask消息闪烁
from flask import Flask, flash, redirect, render_template, request, url_for
app = Flask(__name__)
app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'
@app.route('/')
def index():
return render_template('index.html')
@app.route('/login', methods = ['GET', 'POST'])
def login():
error = None
if request.method == 'POST':
if request.form['username'] != 'admin' or \
request.form['password'] != 'secret':
error = 'Invalid username or password. Please try again!'
else:
flash('You were successfully logged in')
return redirect(url_for('index'))
return render_template('login.html', error = error)
if __name__ == "__main__":
app.run(debug = True)
三、报错参考
1、RuntimeError
错误地址: session['username'] = 'coco' 未加密
RuntimeError: The session is unavailable because no secret key was set. Set the secret_key on the application to something unique and secret.
解决方法: 加密 app.secret_key = 'asfda8r9q3y9qy#%GFSD^%WTAfasdfasqwe' # 加密方式(密钥种子)
2、redis.exceptions.ConnectionError
错误 :redis 服务器未开启
redis.exceptions.ConnectionError: Error 111 connecting to 127.0.0.1:6379. Connection refused.
解决方法: 打开终端输入 redis-server
3、werkzeug.routing.BuildError
错误 :反向解析路由传参的参数名不对
werkzeug.routing.BuildError: Could not build url for endpoint 'first.art' with values ['d']. Did you forget to specify values ['id']?
解决方法:改一下反向解析后面的参数名即可
4、werkzeug.routing.BuildError
错误 : 反向解析过程中蓝图指向方法不一致
werkzeug.routing.BuildError: Could not build url for endpoint 'first.art' with values ['id']. Did you mean 'first.art1' instead?
解决方法:反向解析函数名和跳转页面定义的函数名一致
5、ValueError: urls must start with a leading slash
错误:子域名设置问题
解决方法:注意路由中引号内的斜线/不能缺少 url_prefix='/app'
6、sqlalchemy.exc.IntegrityError: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'xiaoming' for key 'name'")
[SQL: INSERT INTO stuf1 (name, age) VALUES (%(name)s, %(age)s)]
[parameters: {'age': 18, 'name': 'xiaoming'}]
(Background on this error at: http://sqlalche.me/e/gkpj)
错误:重复添加不可重复数据
解决方法:注意唯一字段
7、sqlalchemy.orm.exc.UnmappedInstanceError
sqlalchemy.orm.exc.UnmappedInstanceError: Class 'builtins.list' is not mapped
错误:未标明的实例错误,添加数据内容写错了all_stus.append(stu) 错误时候写的是括号内(all_stus)
解决方法: 注意后台代码的准确性
8、TypeError
TypeError: not_() takes 1 positional argument but 2 were given
错误:flask框架中查询时,非not_,的参数是能有一个
解决方法:not_放在一个需要修饰的参数前面
9、AssertionError
View function mapping is overwriting an existing endpoint function: blue.hello
错误:视图函数路径指向有问题
10、sqlalchemy.exc.NoForeignKeysError
sqlalchemy.exc.NoForeignKeysError: Could not determine join condition between parent/child tables on relationship Grade.stus - there are no foreign keys linking these tables. Ensure that referencing columns are associated with a ForeignKey or ForeignKeyConstraint, or specify a 'primaryjoin' expression.
错误:定义模型类时关联字段有问题
解决方法:ForeignKey('grade_id') => ForeignKey('grade.id') 分清关联的是谁的哪个字段在sql语句中和Python中的不同写法
11、AttributeError: type object 'Integer' has no attribute '_set_parent_with_dispatch'
错误原因:模型类书写错误
解决方法:db.Column('s_id'),db.Integer,db.ForeignKey('stu.id')) => db.Column('s_id',db.Integer,db.ForeignKey('stu.id')) 把括号位置写对
12、# relationship为关联关系,backref为反向引用
stus = db.relationship('Student', backref='g')
错误: 移除数据,调用remove方法,当数据不存在的时候报错
解决方法:使用异常处理 try ... except