1.Flask框架安装

简介:轻量级WEB框架,类似于简单版本的Django  

pip install flask

  

  • 环境文件生成

pip freeze > requirement.txt
  • 环境文件安装

pip install -r requirement.txt

  

2. 简单入门

# 1.导入FlasK扩展
from flask import Flask, render_template # 2.创建Flask应用实例,需要传入__name__,确定资源路径
app = Flask(__name__) # 3.定义路由及视图函数,装饰器实现路由
# 请求方式,利用methods自行指定
@app.route('/', methods=['GET', 'POST'])
def hello_world():
# 传值
url_str = 'www.baidu.com'
my_list = [1, 2, 3, 4, 5, 6]
my_dist = {
'name':'123',
'age' : '13',
}
# 可以返回,字符串和模板
return render_template('index.html', url_str=url_str, my_list=my_list, my_dist=my_dist) # 6.路由参数获取和限定,int:限定,强制转换,成功既可以访问,float:同理
@app.route('/orders/<int:order_id>')
def get_order_id(order_id):
# 路由的访问优化 return 'order_id %s' % order_id # return 'Hello World!' # 4.启动程序
if __name__ == '__main__':
# 执行后,Flask运行在简易服务器,用于测试
app.run()

  

  

3.模板

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>index</title>
</head>
<body>
<h1>变量代码块</h1>
{# 注释在这里 #}
<a href="{{ url_str}}">百度</a> <br>
{{ my_list }} <br>
{{ my_list.1 }} <br>
{{ my_list[2] }} <br>
{{ my_dist }} <br>
{{ my_dist['name'] }} <br>
<hr>
<h1>控制代码块</h1>
{#for 循环的使用#}
{% for num in my_list %}
{# if判断的使用#}
{% if num > 3 %}
{{ num }} <br>
{% endif %}
{% endfor %} <h1>过滤器</h1>
{#转大写#}
{{ url_str | upper }} <br>
{#字符串反转#}
{{ url_str | reverse }} <br>
{# 链式调用 #}
{{ url_str | upper | reverse | lower | reverse}} <br> </body>
</html>

  

4.表单

table_index.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>table</title>
</head>
<body>
<form method="post">
<lable>用户名:</lable><input type="text" name="username"><br>
<lable>密码:</lable><input type="password" name="password"><br>
<lable>确认密码:</lable><input type="password" name="password2"><br>
<input type="submit" value="提交"><br>
{#获取app中flash输出的内容#}
{% for message in get_flashed_messages() %}
{{ message }}
{% endfor %}
</form>
</body>
</html>

 app.py

# 1.导入FlasK扩展
from flask import Flask, render_template,request,flash # 2.创建Flask应用实例,需要传入__name__,确定资源路径
app = Flask(__name__)
# 加密
app.secret_key = 'jiami'
# 3.定义路由及视图函数,装饰器实现路由
# 请求方式,利用methods自行指定
@app.route('/', methods=['GET', 'POST'])
def hello_world():
# 传值
url_str = 'www.baidu.com'
my_list = [1, 2, 3, 4, 5, 6]
my_dist = {
'name': '123',
'age': '13',
}
# 可以返回,字符串和模板
return render_template('index.html', url_str=url_str, my_list=my_list, my_dist=my_dist) @app.route('/table', methods=['GET', 'POST'])
def table_index():
# request: 请求对象
if request.method == 'POST':
# 获取请求参数
username = request.form.get("username")
password = request.form.get("password")
password2 = request.form.get("password2")
print(username,password,password2)
if not all([username,password,password2]):
# flash发消息,发送给模板,消息需要加密secret_key
flash(u"参数不完整")
elif password != password2:
flash(u"密码不一致")
else:
return "登录成功"
# return request.method
return render_template('table_index.html') # 6.路由参数获取和限定,int:限定,强制转换,成功既可以访问,float:同理
@app.route('/orders/<int:order_id>')
def get_order_id(order_id):
# 路由的访问优化 return 'order_id %s' % order_id # return 'Hello World!' # 4.启动程序
if __name__ == '__main__':
# 执行后,Flask运行在简易服务器,用于测试
app.run()

  

5.flask-WTF(类似Django)

安装 

pip install flask-wtf

 app.py

# 导入FlasK扩展
from flask import Flask, render_template, request
from flask import flash
# 导入WTF扩展表单类
from flask_wtf import FlaskForm
# 导入自定义表单需要的字段
from wtforms import StringField, PasswordField, SubmitField
# 导入WTF扩展提供的表单验证器,有数据,比较相等,验证长度,验证数字范围,url
from wtforms.validators import DataRequired, EqualTo, length, NumberRange # 创建Flask应用实例,需要传入__name__,确定资源路径
app = Flask(__name__)
# 加密
app.secret_key = '123456' #  自定义表单类
class LoginForm(FlaskForm):
uesrname = StringField('用户名', validators=[DataRequired()])
password = PasswordField('密码', validators=[DataRequired()])
password2 = PasswordField('确认密码', validators=[DataRequired(), EqualTo('password', '密码不一致')])
submit = SubmitField('提交') @app.route('/', methods=['GET', 'POST'])
def login():
login_form = LoginForm()
# 验证逻辑
if request.method == 'POST':
username = request.form.get("username")
password = request.form.get("password")
password2 = request.form.get("password2")
# 验证参数,提交即验证
# 没有CSRF_token验证
if login_form.validate_on_submit():
return '验证成功'
else:
print(password,password2)
# 需要在模板中先进行渲染
flash(u'消息有误')
return render_template('table_WTF.html', form=login_form) # 启动程序
if __name__ == '__main__':
# 执行后,Flask运行在简易服务器,用于测试
app.run()

  

table_WTF.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>table_WTF</title>
</head>
<body>
<form method="post">
<lable>用户名:</lable><input type="text" name="username"><br>
<lable>密码:</lable><input type="password" name="password"><br>
<lable>确认密码:</lable><input type="password" name="password2"><br>
<input type="submit" value="提交"><br>
</form>
<hr>
<form method="post">
{{ form.csrf_token() }}
{{ form.uesrname.label }} {{ form.uesrname }} <br>
{{ form.password.label }} {{ form.password }} <br>
{{ form.password2.label }} {{ form.password2 }} <br>
{{ form.submit }} <br> {#获取app中flash输出的内容#}
{% for message in get_flashed_messages() %}
{{ message }}
{% endfor %}
</form>
</body>
</html>

  

6.flask使用数据库

安装

pip install flask-sqlalchemy

  

连接mysql还需要安装

pip install flask-mysqldb

  

# 导入FlasK扩展
from flask import Flask
# 引入数据库扩展
from flask_sqlalchemy import SQLAlchemy # 创建Flask应用实例,需要传入__name__,确定资源路径
app = Flask(__name__) # 配置数据库地址
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:root@127.0.0.1/flask_sql'
# 跟踪数据库更改--不建议开启
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
"""表模型创建""" db = SQLAlchemy(app) # 继承db.Model,代表数据库模型
class Role(db.Model):
# 表名
__tablename__ = 'roles'
# 字段名
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(16), unique=True) class User(db.Model):
# 表名
__tablename__ = 'users'
# 字段名
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(16), unique=True)
# 表名.id实现外键
role_id = db.Column(db.Integer, db.ForeignKey('roles.id')) # 创建表的位置必须放在模型下方
# 删除表
db.drop_all()
# 创建表
db.create_all() @app.route('/', methods=['GET', 'POST'])
def login():
return 'hello' # 启动程序
if __name__ == '__main__':
# 执行后,Flask运行在简易服务器,用于测试
app.run(debug=True) 

增删改操作

'''
In [1]: from app import *
# 增加,增加多个add_all([uesr1,user2])
In [2]: role = Role(name='admin')
In [3]: db.session.add(role)
In [4]: db.session.commit() In [5]: user = User(name='xiaohei',role_id=role.id)
In [6]: db.session.add(user)
In [7]: db.session.commit()
修改
In [8]: user.name = 'xiaobai'
In [9]: db.session.commit()
删除
In [15]: db.session.delete(user)
In [16]: db.session.commit()
'''

  

7.综合案例

app.py

# 0.导入FlasK扩展
# 7.重定向redirect, url_for
from flask import Flask, render_template, request, flash, redirect, url_for
# 1.引入数据库扩展
from flask_sqlalchemy import SQLAlchemy
# 5.继承FlaskForm
from flask_wtf import FlaskForm
# 5. 导入模型
from wtforms import StringField, SubmitField
# 5. 表单验证
from wtforms.validators import DataRequired '''
1.配置数据库:引入扩展,配置数据库,创建数据库对象,使用终端创建数据库
2.添加模型:添加书和作者的模型
3.添加数据: 直接添加
4.使用模板显示数据库查询数据:查询所有作者信息,作者获取数据用的是关系引用
5.WTF表单显示:自定义表单类,模板中显示,secret_key/编码/csrf_token
6.实现相关增加逻辑
7.实现相关删除逻辑:穿ID,路由接收参数
''' # 创建Flask应用实例,需要传入__name__,确定资源路径
app = Flask(__name__) # 1.配置数据库
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:root@127.0.0.1/flask_books'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 5.secret_key
app.secret_key = '123456' # 1.创建数据库对象
db = SQLAlchemy(app) # 1.在终端创建flask_books数据库:create database flask_books charset=utf8 # 2.定义书模型
# 继承db.Model,代表数据库模型
class Book(db.Model):
# 表名
__tablename__ = 'books'
# 字段名:ID,书名,外键author_id---author引用
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(16), unique=True)
# 外键
author_id = db.Column(db.Integer, db.ForeignKey('authors.id')) # repr()显示一个可读字符串
def __repr__(self):
return '<Book:%s %s>' % (self.name, self.author_id) # 2.定义作者模型
class Author(db.Model):
# 表名
__tablename__ = 'authors'
# 字段名:ID,名字,---books引用
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(16), unique=True)
# 关系引用books是Author模型用,author是Book模型用的
books = db.relationship('Book', backref='author') # 方便查看
def __repr__(self):
return '<author:%s %s>' % (self.name, self.id) # TypeError: __init__() takes from 1 to 2 positional arguments but 3 were given
# 原因:DataRequired没有加括号 # 5.自定义表单类
class AuthorForm(FlaskForm):
author = StringField('作者', validators=[DataRequired()])
book = StringField('书籍', validators=[DataRequired()])
submit = SubmitField('提交') # 3.添加数据
# 删除表
db.drop_all()
# 创建表
db.create_all() au1 = Author(name='张三')
au2 = Author(name='李四')
au3 = Author(name='王五')
au4 = Author(name='赵六') # 数据给会话,提交会话
db.session.add_all([au1, au2, au3, au4])
db.session.commit() bk1 = Book(name='张三的一生', author_id=au1.id)
bk2 = Book(name='张三的辉煌', author_id=au1.id)
bk3 = Book(name='李四的辉煌', author_id=au2.id)
bk4 = Book(name='王五的辉煌', author_id=au3.id)
bk5 = Book(name='王五的一生', author_id=au3.id)
bk6 = Book(name='赵六的一生', author_id=au4.id) # 数据给会话,提交会话
db.session.add_all([bk1, bk2, bk3, bk4, bk5, bk6])
db.session.commit() # 7.删除数据的路由
@app.route('/delete_book/<book_id>')
def delete_book(book_id):
# 查询数据库,是否有该ID的书,有就删除,没有报错
# 删除书
book =Book.query.get(book_id)
if book:
try:
db.session.delete(book)
db.session.commit()
except Exception as e:
print(e)
flash('删除书籍出错')
db.session.rollback()
else:
flash('书籍找不到')
# 如何返回当前网址,重定向
# redirect需要传入网址/路由地址
# url_for()需要传入视图函数名,返回该视图函数对应的路由地址
print(url_for('login'))
return redirect(url_for('login')) # 8.删除作者
@app.route('/delete_author/<author_id>')
def delete_author(author_id):
# 查询作者,先删书,在删作者
author = Author.query.get(author_id)
if author:
try:
# 查询后直接删除
Book.query.filter_by(author_id=author_id).delete()
# 删除作者
db.session.delete(author)
db.session.commit()
except Exception as e:
print(e)
flash('删除作者出错')
db.session.rollback()
else:
flash("作者找不到")
return redirect(url_for('login')) # 4:将数据信息,传给模板
@app.route('/', methods=['GET', 'POST'])
def login():
# 4.查询作者信息,传给模板
authors = Author.query.all()
# 5.创建自定义表单类
author_form = AuthorForm()
# 6.调用WTF验证函数实现验证
if author_form.validate_on_submit():
# 6.验证通过获取数据
author_name = author_form.author.data
book_name = author_form.book.data
# 6.查询数据,判断是否存在,是否存在重复,增加相应数据
author = Author.query.filter_by(name=author_name).first()
if author:
# 作者存在,查询数据
book = Book.query.filter_by(name=book_name).first()
if book:
flash('已存在重复书籍')
else:
try:
new_book = Book(name=book_name, author_id=author.id)
db.session.add(new_book)
db.session.commit()
except Exception as e:
print(e)
flash("添加书籍失败")
# 回滚
db.session.rollback()
else:
# 作者不存在
try:
new_author = Author(name=author_name)
db.session.add(new_author)
db.session.commit() new_book = Book(name=book_name, author_id=new_author.id)
db.session.add(new_book)
db.session.commit()
except Exception as e:
print(e)
flash("添加作者和书籍失败")
# 回滚
db.session.rollback()
else:
if request.method == 'post':
# 6.验证出错,提示错误
flash('参数错误') return render_template('books.html', authors=authors, form=author_form) # 启动程序
if __name__ == '__main__':
# 执行后,Flask运行在简易服务器,用于测试
app.run(debug=True)

  

books.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>books</title>
</head>
<body>
{#5.表单显示#}
<form method="post">
{{ form.csrf_token() }}
{{ form.author.label }}{{ form.author }} <br>
{{ form.book.label }}{{ form.book }} <br>
{{ form.submit }} <br>
{#获取app中flash输出的内容#}
{% for message in get_flashed_messages() %}
{{ message }}
{% endfor %}
</form> <hr>
{#4.先遍历作者,然后作者下方遍历书籍#}
<ul>
{# 遍历传入的作者信息 #}
{% for author in authors %}
<li>{{ author.name }}<a href="{{ url_for("delete_author", author_id=author.id) }}">删除</a></li>
<ul>
{# 根据作者找到书籍,遍历数据的名称#}
{% for book in author.books %}
<li>{{ book.name }}<a href="{{ url_for("delete_book", book_id=book.id) }}">删除</a></li>
{% else %}
<li>无</li>
{% endfor %}
</ul>
{% endfor %}
</ul>
</body>
</html>

  

现象

<后端>Flask框架的更多相关文章

  1. Flask 框架入门

    Flask Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 . 安装 Flask 依赖两个外部库, We ...

  2. Flask框架获取用户IP地址的方法

    本文实例讲述了python使用Flask框架获取用户IP地址的方法.分享给大家供大家参考.具体如下: 下面的代码包含了html页面和python代码,非常详细,如果你正使用Flask,也可以学习一下最 ...

  3. Python自动化运维之30、Flask框架

    Flask 官网:http://flask.pocoo.org/ flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是 ...

  4. flask框架+pygal+sqlit3搭建图形化业务数据分析平台

    一. 前言 先说下主要的框架和主要的图形库的特点:(个人见解) Django:python开发的一个重量级的web框架,集成了MVC和ORM等技术,设计之初是为了使开发复杂的.数据库驱动的网站变得简单 ...

  5. 2nd_SE-结对编程1-基于flask框架的四则运算生成器

    0x00 Coding https://coding.net/u/nikochan/p/2nd_SE/git 0x01 写在前面 因为在上一个作业中,是基于python完成的Command程序.那么再 ...

  6. Flask框架

    FLask框架的简单介绍 Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请 ...

  7. Python基于Flask框架配置依赖包信息的项目迁移部署小技巧

    一般在本机上完成基于Flask框架的代码编写后,如果有接口或者数据操作方面需求需要把代码部署到指定服务器上. 一般情况下,使用Flask框架开发者大多数都是选择Python虚拟环境来运行项目,不同的虚 ...

  8. Flask框架(1)--基础

    Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...

  9. Flask框架搭建一个日程表

    目录 前言 项目介绍 技术栈 Flask Web开发流程 一.搭建环境 1.1: 创建虚拟环境 1.2: 安装依赖包 1.3: 创建依赖包列表文件 1.4: 测试hello word 二.应用程序开发 ...

  10. Flask框架搭建REST-API服务

    一.目的 为了能够将测试工具部署成RESTful-API服务,这样就能通过接口的方式提供统一测试工具服务,使用人员就不用构建application而产生的各种环境问题.使用问题. 适合人群:Pytho ...

随机推荐

  1. SQL比较时间查询语句

    select * from table1 where datediff(mm,'2009-8-12 13:17:50', date)>0 select * from table1 select ...

  2. 如何解决Unsupported major.minor version 52.0问题?

    为什么出现Unsupported major.minor version 52.0? You get this error because a Java 7 VM tries to load a cl ...

  3. 拾遗:Go 单元测试

    概念 回归测试:是指修改了旧代码之后,重新进行测试,以确保修改没有引入新的错误或导致其它代码产生错误: 单元测试:是指对软件中的最小可测试单元(单个函数或类)进行检查和验证 Test-Driven D ...

  4. 【Linux】- 守护进程的启动方法

    转自:Linux 守护进程的启动方法 Linux中"守护进程"(daemon)就是一直在后台运行的进程(daemon). 本文介绍如何将一个 Web 应用,启动为守护进程. 一.问 ...

  5. extend java vm memory parameter in pom.xml

    <project> [...] <build> [...] <plugins> <plugin> <groupId>org.apache.m ...

  6. 借用数组对象的prototype给数组扩充降维方法

    原理:只要是一个对象,他都有一个prototype原型对象,保存共有的属性和方法. <!DOCTYPE html> <html lang="en"> < ...

  7. 完美编译街机模拟器MAME(Android版)基于MAME4all

    重新编译MAME4droid源码 github上开源项目MAME4all可将MAME模拟器运行在iOS和Android上,还有一个比较有名的叫MAME4droid(MAME for android), ...

  8. 如何恢复误删的OneNote页面

    今天不小心把半个月的日记删掉了!(为了减少页面数量,每个月的日记会放在同一个页面上). 幸运的是OneNote有自动备份功能,喜极而泣. 操作方法来自微软支持 打开丢失了最近笔记的笔记本. 单击“文件 ...

  9. day04 mysql单表查询 多表查询 pymysql的使用

    day04 mysql pymysql   一.单表查询     1.having过滤         一般用作二次筛选             也可以用作一次筛选(残缺的: 只能筛选select里面 ...

  10. sqlmap结合burpsuite对post请求进行注入测试

    1. 浏览器打开目标地址 http://testasp.vulnweb.com/Login.asp 2. 配置burp代理(127.0.0.1:8080)以拦截请求 3. 点击login表单的subm ...