# 安装Flask
pip install Flask #flask==1.0.2指定版本
# 基础示例
from flask import Flask
app=Flask(__name__)
#(不设置默认当前目录,static,template)
#app=Flask(__name__,
# static_folder = "./dist/static", #设置静态文件路径
# template_folder = "./dist" #设置模板路径
# static_url_path='', #设置从根目录读取文件路径 /img/xxx
#)
#<配置热更新
app.jinja_env.auto_reload = True
app.config['TEMPLATES_AUTO_RELOAD'] = True
#>
@app.route('/') # route() 装饰器来告诉 Flask 触发函数的 URL
def index():
return 'index page'
@app.route('/home/<int:uid>')
def home(uid):
return 'home page %s'%uid
if __name__ == '__main__':
app.run(host='127.0.0.1',port=8085) #监听运行 debug模式:debug=True, host='0.0.0.0' 允许所有访问
# @app.route 变量规则
1. <username> string 接受任何不包含斜杠的文本
@app.route('/user/<username>')
def show_user_profile(username):
2. int 接受正整数, float 接受正浮点数
@app.route('/post/<int:uid>')
def show_post(uid):
3. path 类似 string ,但可以包含斜杠
@app.route('/path/<path:subpath>')
def show_subpath(subpath):
4.正则URL示例
from flask import Flask
from werkzeug.routing import BaseConverter
class Regex_url(BaseConverter):
def __init__(self,url_map,*args):
super(Regex_url,self).__init__(url_map)
self.regex = args[0]
app = Flask(__name__)
app.url_map.converters['re'] = Regex_url
@app.route('/user/<re("[a-z]{3}"):id>')
def hello_itcast(id):
return 'hello %s' %id
# url_for() 函数用于构建指定函数的 URL
from flask import Flask,url_for
@app.route('/home')
def home():
...
@app.route('/user/<username>')
def profile(username):
...
print(url_for('home', page='11')) # /home?page=11
print(url_for('profile', username='John Doe')) # /user/John%20Doe
# 设置接收请求方式
-----------
from flask import request,make_response,render_template,jsonify
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
name=request.form.get('username', '') #post拿数据
return jsonify({'name':name}) # jsonify 函数转换JSON数据
else:
name=request.args.get('username', '') #get拿数据
# 重定向和错误
使用 redirect() 函数可以重定向。使用 abort() 可以 更早退出请求,并返回错误代码:
from flask import abort, redirect, url_for
@app.route('/')
def index():
return redirect('/login')
@app.route('/login')
def login():
abort(404)
@app.errorhandler(404) # errorhandler() 装饰器可以定制出错页面
def page_not_found(error):
return render_template('404.html')
----
# 操作session
from flask import Flask, session, escape
app = Flask(__name__)
#使用会话之前你必须设置一个密钥
app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'
1. session['username'] = 666 #设置
2. session['username'] #获取
3. session.pop('username', None) #删除
4. escape(s) 将字符串s中的字符&,<,>,'和'转换为HTML安全序列
------
# 操作cookies
1.读取 cookies
request.cookies.get('username')
2.储存 cookies
@app.route('/')
def index():
resp = make_response(render_template(...))
resp.set_cookie('username', 'the username')
return resp
注意:cookies 设置在响应对象上。通常只是从视图函数返回字符串, Flask 会把它们 转换为响应对象。如果你想显式地转换,那么可以使用 make_response() 函数,然后再修改它。
------------
# 静态文件
只要在你的包或模块旁边创建一个名为 static 的文件夹就行了同templates一样,静态文件位于应用的 /static 中
# 渲染模板
Flask 会在 templates 文件夹内寻找模板。因此,如果你的应用是一个模块, 那么模板文件夹应该在模块旁边;如果是一个包,那么就应该在包里面:
情形 1 : 一个模块:
/application.py
/templates
/hello.html
情形 2 : 一个包:
/application
/__init__.py
/templates
/hello.html
例:
from flask import render_template #使用 render_template() 方法可以渲染模板
@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
return render_template('hello.html', name=name)
#文件上传
--------
from flask import request
@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
f = request.files['the_file'] #拿到数据
f.save('/uploads/%s'%f.filename) #filename获取文件名,并保存
---------
#模块化路径蓝图设置
1.main.py 主
from flask import Flask
#导入蓝图对象
from login import logins
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
#注册蓝图,第一个参数logins是蓝图对象,url_prefix参数默认值是根路由,如果指定,会在蓝图注册的路由url中添加前缀。
app.register_blueprint(logins,url_prefix='') #url_prefix='/login'
if __name__ == '__main__':
app.run()
2.login.py 副
from flask import Blueprint,render_template
#创建蓝图,第一个参数指定了蓝图的名字。
logins = Blueprint('login',__name__)
@logins.route('/login')
def login():
return render_template('login.html')
#简单封装自定义数据库操作
pip3 install PyMySQL
1.创建db.py
----------
import pymysql
from flask import g
class DB():
def __init__(self,host="localhost",name="root",pw="12345678",base="test"):
if 'db' not in g:
g.db=pymysql.connect(host,name,pw,base)
self.cur=g.db.cursor(cursor = pymysql.cursors.DictCursor) #获取操作游标 ,取值字典类型
self.conn=g.db #拿到db
def close_db(self,e=None):
db=g.pop('db',None)
if db is not None:
db.close()
def exec_sql(self, sql, *args):
try:
rows = self.cur.execute(sql, args) # rows记录受影响的行
if sql.strip().lower().startswith('select') or sql.strip().lower().startswith('show'):
res = self.cur.fetchall()
return res
else:
self.conn.commit() # 非查询语句需要提交才能生效
res = rows
return res
except Exception as e:
return e
def __del__(self):
self.close_db()
----
2.使用方式
from flask import Flask,jsonify
from db import DB
app=Flask(__name__)
@app.route('/getAll')
def index():
db=DB(base="info")
arr=db.exec_sql('select * from name where id>%s',1) #避免sql注入
return jsonify({'code':200,'data':arr})
-----------
#使用Flask-SQLAlchemy管理数据库
---------
1.安装依赖
pip install flask-sqlalchemy
pip install flask-mysqldb
#常用的SQLAlchemy字段类型
-----
类型名 python中类型 说明
Integer int 普通整数,一般是32位
SmallInteger int 取值范围小的整数,一般是16位
BigInteger int或long 不限制精度的整数
Float float 浮点数
Numeric decimal.Decimal 普通整数,一般是32位
String str 变长字符串
Text str 变长字符串,对较长或不限长度的字符串做了优化
Unicode unicode 变长Unicode字符串
UnicodeText unicode 变长Unicode字符串,对较长或不限长度的字符串做了优化
Boolean bool 布尔值
Date datetime.date 时间
Time datetime.datetime 日期和时间
LargeBinary str 二进制文件
-----------
#常用的SQLAlchemy列选项
------
选项名 说明
primary_key 如果为True,代表表的主键
unique 如果为True,代表这列不允许出现重复的值
index 如果为True,为这列创建索引,提高查询效率
nullable 如果为True,允许有空值,如果为False,不允许有空值
default 为这列定义默认值
-------
#常用的SQLAlchemy关系选项
-----
选项名 说明
backref 在关系的另一模型中添加反向引用
primary join 明确指定两个模型之间使用的联结条件
uselist 如果为False,不使用列表,而使用标量值
order_by 指定关系中记录的排序方式
secondary 指定多对多中记录的排序方式
secondary join 在SQLAlchemy中无法自行决定时,指定多对多关系中的二级联结条件
--------
网友评论