flask介绍
基本使用
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'hello world'
app.run()
路由
-
路由匹配 @app.route('/hello')
括号里的就是访问时的路由,默认端口号为5000,可在后面追加请求方式的限定 @app.route('/hello',methods=['get','post'])
-
路由变量规则 在路由后面追加变量,用一对 < > 表示提取参数 @app.route('/hello/<num>')
def index(num):
if num == '1':
return 'good 1'
if num == '2':
return 'good 2'
return 'no good'
在变量前可加上类型转换器 @app.route('/hello/<int:num>')
- int:接收正整数
- float:接收正浮点数
- path:接收包含斜杠的文本
- 转换器可自定义
-
渲染form表单 需要引入flask里的render_template 模块,并且在返回时将表单文件用render_template属性限制。 结构: <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
账号:<input type="text" name="name" >
<br>
密码:<input type="password" name="password">
<br>
<button>提交</button>
</body>
</html>
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/index')
def index():
return render_template('index.html')
app.run()
效果:
request对象
一、基本使用
使用flask中的request模块可以获取请求方式
@app.route('/index', methods=['GET', 'POST'])
def index():
if request.method == 'GET':
return render_template('index.html')
if request.method == 'POST':
name = request.form.get('name')
print(name)
return 'this is post'
这里页面的请求方式为get,点击按钮后提交方式为post
<body>
<form action="" method="post">
账号:<input type="text" name="name" >
<br>
密码:<input type="password" name="password">
<br>
<button>提交</button>
</form>
</body>
二、重定向
需要引入redirect模块
from flask import Flask, redirect
app = Flask(__name__)
@app.route('/index')
def index():
return redirect('https://baidu.com')
if __name__ == '__main__':
app.run()
三、返回json数据给前端
两种方法:
- 引入
make_response ,和json 发送 - 引入
jsonify 发送 一般使用这种方式
注意:返回中文时要进行编码设置app.config['JSON_AS_ASCII'] = False
from flask import Flask, make_response, json,jsonify
app = Flask(__name__)
@app.route('/index')
def index():
data = {
'name': '张三',
'age': 19
}
return jsonify(data)
response = make_response(json.dumps(data))
response.mimetype = 'application/json'
return response
if __name__ == '__main__':
app.run()
四、abort函数
在网页中抛出异常,使用abort(编码) ,网页直接抛出编码对应的异常。 abort需要引入。
from flask import Flask, abort, request, render_template
app = Flask(__name__)
@app.route('/index', methods=['GET', 'POST'])
def index():
if request.method == 'GET':
return render_template('index.html')
if request.method == 'POST':
name = request.form.get('name')
password = request.form.get('password')
if name != 'zhangsan' or password != '123':
abort(404)
return None
else:
return 'login success'
if __name__ == '__main__':
app.run()
模板
一、jinjia2模板语法
通过模板语法把数据返回给前端供前端使用
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/index')
def index():
data = {
'name': '张三',
'age': 18,
'mylist': [1, 2, 3, 4, 5, 6, 7]
}
return render_template('index2.html', data=data)
if __name__ == '__main__':
app.run()
<body>
<br>
{{data}}
<br>
{{data.name}} - {{data['age']}} - {{data.mylist}}
<br>
计算: mylist[1]+mylist[2]= {{data.mylist[1]+data.mylist[2]}}
</body>
二、过滤器
-
Jinja2模板内置过滤器 使用 竖线 ‘ | ’ 表示过滤器 {{data.mylist|length}}
常用过滤器:
first (value):返回一个序列的第一个元素。names|first。last (value):返回一个序列的最后一个元素。示例:names|last。length (value):返回一个序列或者字典的长度。示例:names|length。join (value,d=u’’):将一个序列用d这个参数的值拼接成字符串。safe (value):如果开启了全局转义,那么safe过滤器会将变量关掉转义。示例:content_html|safe。int (value):将值转换为int类型。float (value):将值转换为float类型。lower (value):将字符串转换为小写。upper (value):将字符串转换为小写。replace (value,old,new): 替换将old替换为new的字符串。truncate (value,length=255,killwords=False):截取length长度的字符串。striptags (value):删除字符串中所有的HTML标签,如果出现多个空格,将替换成一个空格。trim :截取字符串前面和后面的空白字符。string (value):将变量转换成字符串。wordcount (s):计算一个长字符串中单词的个数。 -
自定义过滤器
def list_step(li):
"""自定义过滤器"""
return li[::2]
app.add_template_filter(list_step, 'li2')
<br>
内置过滤器: {{data.mylist | length}}
<br>
自定义过滤器: {{data.mylist | li2}}
form表单
form表单是后端写的表单,需要用到python和flask中的一些模块
<body>
<form action="" method="post">
{{ form.user_name.label }}:
{{ form.user_name }}
<br>
{{ form.password.label }}:
{{ form.password }}
<br>
{{ form.password2.label }}:
{{ form.password2 }}
<br>
{{ form.submit }}
</form>
</body>
from flask import Flask, render_template, request
from wtforms import StringField, PasswordField, SubmitField
from flask_wtf import FlaskForm
from wtforms.validators import DataRequired, EqualTo
app = Flask(__name__)
app.config['SECRET_KEY'] = 'ADSEFFW'
class Register(FlaskForm):
user_name = StringField(label='用户名', validators=[DataRequired('用户名不能为空')])
password = PasswordField(label='密码', validators=[DataRequired('密码不能为空')])
password2 = PasswordField(label='确认密码', validators=[DataRequired('密码不能为空'), EqualTo('password')])
submit = SubmitField(label='提交')
@app.route('/register', methods=['GET', 'POST'])
def register():
form = Register()
if request.method == 'GET':
return render_template('register.html', form=form)
if request.method == 'POST':
username = form.user_name.data
password = form.password.data
print(username, password)
return render_template('register.html', form=form)
if __name__ == '__main__':
app.run()
flask数据库
一、Flask-SQLAlchemy
- SQLAlchemy:一个独立的数据库的
ORM框架 ,让我们操作数据库的时候不用再用SQL语句了,跟直接操作模型一样,给python直接安装这个包即可。 - Flask-SQLAlchemy:对
SQLAlchemy 的封装,能够更适合在flask中使用。 - ORM ,全称 Object Relational Mapping ,中文叫做对象关系映射,通过 ORM 我们可以通过类的方式去操作数据库,而不用再写原生的SQL语句。通过把表映射成类,把行作实例,把字段作为属性, ORM 在执行对象操作的时候最终还是会把对应的操作转换为数据库原生语句。
二、pymysql
python中用来连接数据库的库 注意区别于SQLAlchemy,一个是操作一个是连接
三、连接数据库
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import create_engine
app = Flask(__name__)
hostname = '127.0.0.1'
port = '3306'
database = 'flask_study'
username = 'root'
password = 'root'
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(username, password, hostname, port, database)
app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI
db = SQLAlchemy(app)
@app.route('/')
def index():
engine = db.get_engine()
with engine.connect() as conn:
result = conn.execute('select 1')
print(result.fetchone())
return 'hello'
if __name__ == '__main__':
app.run()
四、操作数据库
先创建一个数据库ORM模型(类),然后就可以通过操作这个模型来控制数据库了,创建方式为新建一个类,继承db.Model
-
建表:db.create_all() ,创建好类之后 -
增:db.session.add(article1) -
查:Article.query.filter_by(id=1) -
改:article4 = Article.query.filter_by(id=2)[0].content = 'yyy' -
删:Article.query.filter_by(id=1).delete() from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import create_engine
app = Flask(__name__)
hostname = '127.0.0.1'
port = '3306'
database = 'flask_study'
username = 'root'
password = 'root'
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(username, password, hostname, port, database)
app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI
db = SQLAlchemy(app)
class Article(db.Model):
__tablename__ = 'article'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
title = db.Column(db.String(200), nullable=False)
content = db.Column(db.Text, nullable=False)
db.create_all()
@app.route('/article')
def article():
article1 = Article(title='钢铁是怎样炼成的', content='xxx')
article2 = Article(title='假如给我三天光明', content='xxx')
db.session.add(article1)
db.session.add(article2)
db.session.commit()
article3 = Article.query.filter_by(id=1)
print(article3[0].title)
article4 = Article.query.filter_by(id=2)[0]
article4.content = 'yyy'
db.session.commit()
article5 = Article.query.filter_by(id=1)
article5.delete()
db.session.commit()
return '数据库操作成功'
if __name__ == '__main__':
app.run()
-
效果展示 建表 增加 修改 删除
五、数据表一对多
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
hostname = '127.0.0.1'
port = '3306'
database = 'flask_study'
username = 'root'
password = 'root'
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(username, password, hostname, port, database)
app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI
db = SQLAlchemy(app)
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(200), nullable=False)
class Article(db.Model):
__tablename__ = 'article'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
title = db.Column(db.String(200), nullable=False)
content = db.Column(db.Text, nullable=False)
author_id = db.Column(db.Integer, db.ForeignKey("user.id"))
author = db.relationship("User", backref="articles")
db.drop_all()
db.create_all()
@app.route('/otm')
def otm():
article1 = Article(title='111', content='xxx')
article2 = Article(title='222', content='yyy')
user = User(username='hihihi')
article1.author = user
article2.author = user
db.session.add(article1, article2)
db.session.commit()
print(user.articles)
return "数据库操作成功"
if __name__ == '__main__':
app.run()
六、数据表一对一
项目迁移
项目重构
flask官方并没有明确的项目结构,而是让开发者根据实际项目需求,创建适合自己的项目结构。 下面是一个常见的项目结构
project/
froms/ ······表单
myform.py
...
models/ ······模型
__init__.py
mymodels.py
...
routes/ ······路由
__init__.py
myroute.py
...
static/ ······静态文件
...
services/ ······大工程中某些服务可以写在这里
__init__.py
...
templates/ ······模板文件
index.html
...
__init__.py ······flask初始化文件内容
config.py ······所有工程配置
manage.py ······开发中使用,使用它启动开发版web服务器
|