Flask框架
内容原创,侵权必究。学习分享请注明地址:https://blog.csdn.net/Jackie_ZHF/article/details/82592928
博主有时间会不定期更新大数据hadoop spark storm人工智能方面的博客
目录
一、What`s Flask
2-1、安装virtualenv
2-2、安装Flask
3-1、第一个flask程序
3-2、Debug模式及使用配置文件
3-3、URL传参到视图
3-4、URL反转
3-5、页面跳转和重定向
4-1、模板渲染和参数
4-2、模板中访问属性和字典
4-3、if判断
4-4、for循环
4-5、过滤器
4-6、继承和使用block
4-7、URL连接和加载静态文件
5-1、安装mysql数据库、PyMySQL
5-2、使用flask+pymysql操作数据库mysql
5-2-1、查询
5-2-2、插入
5-2-3、更新
5-2-4、删除
7-1、Session和cookie
7-2、Flask中session工作机制
7-3、flask操作session
八、项目实战
8-1、proxypool
一、What`s Flask
Flask是一个使用 Python 编写的轻量级 Web 应用框架。灵活性伸缩性很好。其WSGI工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权。
Flask 依赖两个外部库, Werkzeug 和 Jinja2。Werkzeug 是一个 WSGI 工具集,它是 web 应用程序和用于开发和部署的服务器之间的标准接口。Jinja2 负责渲染模板。
因此怎样才能快速地安装这一切了?你有很多种方法去安装,但是最简单粗暴的方式就是 virtualenv。Virtualenv 能够允许多个不同版本的 Python 安装,每一个服务于各自的项目。 它实际上并没有安装独立的 Python 副本,只是提供了一种方式使得环境保持独立。
安装virtualenv
# sudo pip install virtualenv |
一旦成功安装 virtualenv,运行 shell 创建自己的环境。我通常会创建一个项目文件夹,其下创建 venv 文件夹:
# mkdir myproject |
# cd myproject/ |
# virtualenv venv |
现在,只要你想要在某个项目上工作,只要激活相应的环境。在 OS X 和 Linux 下,按如下做:
无论哪种方式,你现在能够使用你的 virtualenv (注意你的 shell 提示符显示的是活动的环境)
2-2、安装Flask
如果你想要用最新版的 Flask 干活,这里有两种方式:你可以使用 pip 拉取开发版本, 或让它操作一个 git checkout。无论哪种方式,依然推荐使用 virtualenv。
在一个新的 virtualenv 上获取一个 git checkout,在开发模式下运行:
# git clone http://github.com/mitsuhiko/flask.git |
# cd flask/ |
# virtualenv venv --distribute |
# python setup.py develop |
Window安装步骤一致,不用加sudo。激活用:venv\scripts\activate
3-1、第一个flask程序
New 一个flask项目
# 首先导入了类 Flask 。这个类的实例化将会是我们的 WSGI 应用。第一个参数是应用模块的名称
from flask import Flask
app = Flask(__name__)
# 使用装饰器 route() 路由 #告诉 Flask 哪个 URL 才能触发我们的函数
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
# 本机访问
# app.run()
# 外部服务器访问
app.run(host='192.168.1.24')
|
现在浏览 http://127.0.0.1:5000/或192.168.1.24:5000/,你会看到你的Hello World问候。
3-2、Debug模式及使用配置文件
# -*- coding:utf-8 -*-
# Author:Jackie Zhou
from flask import Flask
import config
app = Flask(__name__)
app.config.from_object(config)
@app.route('/')
def hell_debug():
a=1
b=0
c=a/b
return "I am Jackie,debug test"
if __name__ == '__main__':
app.run() |
# -*- coding:utf-8 -*-
# Author:Jackie Zhou
DEBUG = True |
3-3、URL传参到视图
# -*- coding:utf-8 -*-
# Author:Jackie Zhou
from flask import Flask
import config
app = Flask(__name__)
@app.route('/')
def helle():
return 'hello url ~'
@app.route('/article/<id>')
def article(id):
return u'您请求的参数:%s' %id
if __name__ == '__main__':
app.run() |
3-4、URL反转
# -*- coding:utf-8 -*-
# Author:Jackie Zhou
from flask import Flask, url_for
import config
app = Flask(__name__)
@app.route('/')
def index():
print (url_for('my_list'))
# 从视图函数到URL函数转换叫反转URL
# 在模板 和 页面重定向 时需要使用URL反转
# 反转带参的时候要添加参数
print (url_for('article',id='123456'))
return 'hello ,This is URL反转 '
@app.route('/list/')
def my_list():
return 'list'
@app.route('/article/<id>/')
def article(id):
return '您请求的参数id是 %s '% id
if __name__ == '__main__':
app.run() |
3-5、页面跳转和重定向
# -*- coding:utf-8 -*-
# Author:Jackie Zhou
from flask import Flask,redirect,url_for
app = Flask(__name__)
@app.route('/')
def index():
login_url = url_for('login')
return redirect(login_url)
# return redirect('/login')
return u'This is Jackie redirect'
@app.route('/login')
def login():
return '这是登录首页'
@app.route('/question/<is_login>/')
def question(is_login):
if is_login == '1':
return '调查问卷页面'
return redirect(url_for('login'))
if __name__ == '__main__':
app.run(debug=True) |
4-1、模板渲染和参数
代码包含模板访问属性和字典
# -*- coding:utf-8 -*-
# Author:Jackie Zhou
'''
1. 在template目录下创建HTML文件模板
从Flask中导入render_template函数,渲染模板。
注意:只需写模板名字,不需要填写templ这个文件夹路径
2.如果只有一个或少数参数 直接填写参数关键字
如果有多个参数可以将参数放在字典中 然后用‘ **字典名 ’把
参数传递进去,模板直接填写关键字参数 方便管理和使用
3.在HTML模板中要使用一个变量,语法{{ 变量名.参数}}
4.如果要访问获取模型中的属性或字典,可以通过{{ 变量名.参数}}或如{{参数['age']}}格式
'''
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/')
# 1
# def index():
# return render_template('index.html')
# 2
# def index():
# return render_template('index.html',username='jackie.Zhou')
# 3 使用字典
# def index():
# context = {
# 'username':'Jackie.Zhou',
# 'gender':'男',
# 'age':18
# }
# return render_template('index.html',**context)
def index():
class Person(object):
name = 'Jack.Ma'
gender = '男'
age =18
p = Person()
context = {
'username':'Jackie.Zhou',
'gender':'男',
'age':18 ,
'person':p ,
# 5
'com':{
'jackie':'www.JJCC.com',
'jack':'www.ali.com'
}
}
return render_template('index.html',**context)
if __name__ == '__main__':
app.run(debug=True) |
4-2、模板中访问属性和字典
代码包含在上面4-1中
4-3、if判断
# -*- coding:utf-8 -*-
# Author:Jackie Zhou
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/<is_login>/')
def index(is_login):
if is_login == '1':
user ={
'username':'jackie' ,
'age':18
}
return render_template('index02.html',user = user)
else:
return render_template('index02.html')
if __name__ == '__main__':
app.run(debug=True) |
4-4、for循环
# -*- coding:utf-8 -*-
# Author:Jackie Zhou
'''
1、字典遍历和Python中一样,可以使用items() keys()、values()、iteritems()
iterkeys()、itervalues()
{% for k,v in user.items() %}
<p>{{ k }}:{{ v }}</p>
{% endfor %}
2、列表遍历
'''
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/')
def index():
user = {
'username': '老裴' ,
'age': 40
}
# 2 列表
webnames = ['www.baidu.com','www.ali.com']
for k,v in user.items():
print(k)
print(v)
return render_template('index03.html',user=user,webnames=webnames)
# 3
@app.route('/games')
def mygame():
heros = [
{
'name':'Jugg',
'love':'80%'
},
{
'name': '斯拉克',
'love': '65%'
},
{
'name': '斧王',
'love': '70%'
},
{
'name': '屠夫',
'love': '85%'
},
{
'name': '祈求者',
'love': '35%'
}
]
return render_template('index03.html',heros = heros)
if __name__ == '__main__':
app.run() |
4-5、过滤器
# -*- coding:utf-8 -*-
# Author:Jackie Zhou
'''
过滤器可以处理变量,把原始变量经过处理后再展示,作用的对象是变量
{{ myimages | default('XXX') }}
default过滤器:如果当前变量不存在,可以指定默认值
length过滤器: 求列表 元组 字典 字符串的长度
'''
from flask import Flask,render_template
app= Flask(__name__)
@app.route('/')
def index():
account =[
{
'user':'lipengpeng' ,
'age':28
},
{
'user': 'liaojin',
'age': 18
},
{
'user': 'xulaotou',
'age': 33
}
]
# return render_template('index04.html',myimages ='https://avatar.csdn.net/F/F/3/1_zy_281870667.jpg')
return render_template('index04.html',account = account)
# https://avatar.csdn.net/9/C/8/3_ly4wu5giy.jpg
if __name__ == '__main__':
app.run(debug=True) |
4-6、继承和使用block
# -*- coding:utf-8 -*-
# Author:Jackie Zhou
'''
1.继承
2.block实现:
可以让子模板实现一些自己的需求,服模板需要提前定义
注意:子模板放在block中(也可以定义多个block)
'''
from flask import Flask,render_template
app = Flask(__name__) @app.route('/')
def index():
return render_template('index05.html')
# 继承 {% extends 'index05.html' %}
@app.route('/login')
def index02():
return render_template('index06.html')
if __name__ == '__main__':
app.run(debug=True) |
4-7、URL连接和加载静态文件
# -*- coding:utf-8 -*-
# Author:Jackie Zhou
'''
url链接
使用{{ url_for('视图函数') }}
加载静态文件 会自动在static中寻找
使用{{ url_for('static',filename='静态文件路径') }}
'''
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index07.html')
@app.route('/login')
def login():
return render_template('index08.html')
if __name__ == '__main__':
app.run(debug=True) |
pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同。但目前pymysql支持python3.x而后者不支持3.x版本。
5-1、安装mysql数据库、PyMySQL
* Mysql安装。 之前安装过,此处省略
* pip install pymysql
5-2、使用flask+pymysql操作数据库mysql
5-2-1、查询
# -*- coding:utf-8 -*-
# Author:Jackie Zhou
import pymysql # 导入 pymysql
# 打开数据库连接
db = pymysql.connect(host="node01", user="root",
password="123456", db="pymysql", port=3306)
# 使用cursor()方法获取操作游标
cur = db.cursor()
# 1.查询操作
# 编写sql 查询语句 user 对应我的表名
sql = "select * from person"
try:
cur.execute(sql) # 执行sql语句
results = cur.fetchall() # 获取查询的所有记录
print("id", "name", "password")
# 遍历结果
for row in results:
id = row[0]
name = row[1]
password = row[2]
print(id, name, password)
except Exception as e:
raise e
finally:
db.close() # 关闭连接 |
5-2-2、插入
# # 2.插入操作
# db = pymysql.connect(host="localhost", user="root",
# password="123456", db="test", port=3307)
#
# # 使用cursor()方法获取操作游标
# cur = db.cursor()
#
# sql_insert = """insert into user(id,username,password) values(4,'liu','1234')"""
#
# try:
# cur.execute(sql_insert)
# # 提交
# db.commit()
# except Exception as e:
# # 错误回滚
# db.rollback()
# finally:
# db.close() |
5-2-3、更新
# # 3.更新操作
# db = pymysql.connect(host="localhost", user="root",
# password="123456", db="test", port=3307)
#
# # 使用cursor()方法获取操作游标
# cur = db.cursor()
#
# sql_update = "update user set username = '%s' where id = %d"
#
# try:
# cur.execute(sql_update % ("xiongda", 3)) # 像sql语句传递参数
# # 提交
# db.commit()
# except Exception as e:
# # 错误回滚
# db.rollback()
# finally:
# db.close() |
5-2-4、删除
# 4.删除操作
# db = pymysql.connect(host="localhost", user="root",
# password="123456", db="test", port=3307)
#
# # 使用cursor()方法获取操作游标
# cur = db.cursor()
#
# sql_delete = "delete from user where id = %d"
#
# try:
# cur.execute(sql_delete % (3)) # 像sql语句传递参数
# # 提交
# db.commit()
# except Exception as e:
# # 错误回滚
# db.rollback()
# finally:
# db.close() |
Flask Script扩展提供向Flask插入外部脚本的功能,包括运行一个开发用的服务器,一个定制的Python shell,设置数据库的脚本,cronjobs,及其他运行在web应用之外的命令行任务;使得脚本和系统分开;
Flask Script和Flask本身的工作方式类似,只需定义和添加从命令行中被Manager实例调用的命令;
官方文档:http://flask-script.readthedocs.io/en/latest/
安装flask-scrip:
进入虚拟环境中,pip install flask-script进行安装
# -*- coding:utf-8 -*-
# Author:Jackie Zhou
from flask_script import Manager
from flaskscript import app
# from dbmanager import DBManager
manager = Manager(app)
@manager.command
def runserver():
print('我的服务器server is runing ...')
# manager.add_command('dbs',DBManager)
if __name__ == '__main__':
manager.run() |
7-1、Session和cookie
在非常多时候,我们需要跟踪浏览者在整个网站的活动,对他们身份进行自动或半自动的识别(也就是平时常说的网站登陆之类的功能),这时候,我们常采用Cookie与 Session来跟踪和判断。
区别
Session信息是存放在server端,但session id是存放在client cookie的,当然php的session存放方法是多样化的,这样就算禁用cookie一样可以跟踪
7-2、Flask中session工作机制
7-3、flask操作session
# -*- coding:utf-8 -*-
# Author:Jackie Zhou
from flask import Flask,session
import os
app = Flask(__name__)
# 使用session要使用SECRET_KEY 用了做加密的。并且这个SECRET_KEY
# 如果每次服务器启动后都变化 那么之前的session就不能通过这个SECRET_KEY进行解密
app.config['SECRET_KEY'] = os.urandom(24)
@app.route('/')
def hello_session():
session['username'] = 'Jack.Ma'
return 'hello world'
@app.route('/get/')
def get_session():
return session.get('username')
@app.route('/del/')
def del_session():
print(session.get('username'))
print(session.pop('username'))
return 'success'
@app.route('/clear/')
def clearsession():
print(session.get('username'))
session.clear()
print(session.get('username'))
return 'clear success'
if __name__ == '__main__':
app.run(debug=True) |
八、项目实战
8-1、proxypool
8-2、cookiepool
https://github.com//germey/proxypool