Flask框架

5 篇文章 0 订阅
2 篇文章 1 订阅

框架简介

  • Flask 框架是轻量级的python编程框架,遵循MVC架构,内部含由两个核心库(werkzeug库 + Jinja2库),可拓展性比较强,开发者可以根据自己的需求进行集成第三方库,自己设计代码框架
  • 主要适合 分层比较少,逻辑较为简单的web项目
  • Flask 框架为非阻塞框架,支持并发

Werkzeug库支持功能

  • URL路由请求集成,一次性可以响应多个用户请求
  • 支持cookie、和会话管理、通过身份缓存建立长连接,提供用户访问通道
  • 支持交互式javascript调试,提升用户体验
  • 处理HTTP基本事务,快速响应用户推送过来的请求

Jinja2库(安全)

  • 支持自动HTML转移功能,控制外部黑客的脚本攻击
  • 页面加载过程中会将源代码进行编译成python字节码
  • 模板集成机制,为用户提供对应的模板

第三方库

  • SQLAlchemy - 实现ORM数据库模型的python库
  • Flask-WTForm - 简化HTML表单处理的python库

Flask目录结构
在这里插入图片描述
框架安装

pip install flask

Hello World程序

from flask import Flask

app = Flask(__name__) 

@app.route('/')
def hellow_word():
	return 'hello world'
if __name__ == '__main__':
	app.run()

配置文件导入

app = Flask(__name__)   # 程序默认名称
app = Flask("myapp")   # 自定义程序名称
app = Flask("myapp", static_folder="path1", template_folder="path2")   #  指定静态文件路径(静态文件+模板) 手动指定


**# 向文件中导入配置项**
# 方式1:
import config
app.config.from_object(config)   # 通过app.config.from_object()方法获取配置文件内容
# 方式2:
app.config.from_object("config") 
# 方式3:
app.config.from_pyfile("config.py")

设置DEBUG模式

from flask import Flask
app = Flask(__name__) 
@app.route('/')
def hellow_word():
	return 'hello world'
if __name__ == '__main__':
	# 方式1
	app.run(debug = True) 	
	# 方式2
	app.debug = Ture     
	app.run()
	# 方式3 - 通过配置文件设置
	app.config.update(DEBUG=True)
	app.run()

	# 绑定IP和端口、默认绑定IP  127.0.0.1  端口:5000
	app.run(host='0.0.0.0', port=8080, debug=True)   # 自定义,真实环境时需要执行各个参数 来对端口进行监听

列出所有的URL参数

http://127.0.0.1:5000/?name=Loen&age&app=ios&app=android  # url

from flask import Flask,request
app = Flask(__name__) 
@app.route('/<id>') 	# id 为路由参数
def hello_world(id):	# 函数接收 id
	return request.args.__str__()     #  返回提取的参数

if __name__ = '__main__':
	app.run(port = 5000)

# 浏览器返回	
ImmutableMultiDict([('name', 'Loen'), ('age', ''), ('app', 'ios'), ('app', 'android')])

浏览器返回服务器数据

# 请求
http://127.0.0.1:5000/?name=Loen&age&app=ios&app=android

print(request.full_path)
# 服务器打印值
/?name=Loen&age&app=ios&app=android

print(request.path)
# 服务器打印值
127.0.0.1 - - [11/May/2020 15:08:34] "GET /?name=Loen&age&app=ios&app=android HTTP/1.1" 200 -

获取参数的值(设置默认值)

# 获取info对应的值
from flask import Flask,request
app = Flask(__name__)

@app.route('/') 
def hello_world():
	return request.args.get("info")     #  返回提取的参数

@app.route('/') 
def hello_world():
	return request.args.get("info",'welcome')  # 获取info的值,如果没有,默认为welcome

if __name__ = '__main__':
	app.run(port = 5000)

获取多个参数值

http://127.0.0.1:5000/?name=Loen&age&app=ios&app=android

from flask import Flask, request
 
app = Flask(__name__)
 
@app.route('/')
def hello_world():
    r = request.args.getlist('app')  # 返回一个list
    return str(r)
  
if __name__ == '__main__':
    app.run(port=5000, debug=True)

# 浏览器返回
['ios', 'android']

指定 HTTP 接收方法

@app.route('/register', methods=['GET', 'POST'])   # 接收post方法
def register():
    print(request.headers)
    print(request.stream.read())
    return 'welcome' 

**# 模拟客户端**
import requests
user_info = {'name': 'Loen', 'password': 'loveyou'}
r = requests.post("http://127.0.0.1:5000/register", data=user_info)
print(r.text)

Post 获取参数

# post上传数据
b'name=Loen&password=loveyou'  # post数据

from flask import Flask, request 

app = Flask(__name__)
@app.route('/register', methods=['POST'])
def register():
    print(request.headers)
    # print(request.stream.read()) # 不要用,否则下面的form取不到数据
    print(request.form)
    # Flask 内置解析器  request.form 
    print(request.form['name'])
    print(request.form.get('name'))
    print(request.form.getlist('name'))
    print(request.form.get('nickname', default='little apple'))
    return 'welcome'

获取Post中列表数据

# post提交数据
name=Loen&age&app=ios&app=android

from flask import Flask, request 

app = Flask(__name__)
@app.route('/register', methods=['POST'])
def register():
	print(request.form.getlist('name'))

JSON数据处理

"""
request.json会自动将json数据转换成Python类型(字典或者列表)
"""
from flask import Flask, request
 
app = Flask("myapp")

@app.route('/add', methods=['POST'])
def add():
    print(request.headers)
    print(type(request.json))
    print(request.json)
    result = request.json['n1'] + request.json['n2']
    return str(result)
 
if __name__ == '__main__':
    app.run(host='127.0.0.1', port=5000, debug=True)

响应JSON数据

"""
响应JSON时,除了要把响应体改成JSON格式,响应头的Content-Type也要设置为application/json
"""
from flask import Flask, request, Response
import json
 
app = Flask("myapp")

@app.route('/add', methods=['POST'])
def add():
    result = {'sum': request.json['n1'] + request.json['n2']}
    return Response(json.dumps(result),  Content-type='application/json')
    # return jsonify(result)   # 使用JSONIF 函数
  
if __name__ == '__main__':
    app.run(host='127.0.0.1', port=5000, debug=True)    

**# 客户端**
import requests 
json_data = {'n1': 5, 'n2': 3}
r = requests.post("http://127.0.0.1:5000/add", json=json_data)
print(r.headers)
print(r.text)

文件上传

# HTML表单中 设置  enctype ="multipart/form-data" 属性     浏览器通过此属性进行发送文件  

from flask import Flask, request
from werkzeug.utils import secure_filename
import os
 
app = Flask(__name__)
 
# 文件上传目录
app.config['UPLOAD_FOLDER'] = 'static/uploads/'
# 支持的文件格式
app.config['ALLOWED_EXTENSIONS'] = {'png', 'jpg', 'jpeg', 'gif'}  # 集合类型
 

# 判断文件名是否是我们支持的格式
def allowed_file(filename):
    return '.' in filename and \
           filename.rsplit('.', 1)[1] in app.config['ALLOWED_EXTENSIONS']
 

@app.route('/upload', methods=['POST'])
def upload():
    upload_file = request.files['image']
    if upload_file and allowed_file(upload_file.filename): # 上传前文件在客户端的文件名
        filename = secure_filename(upload_file.filename)
        # 将文件保存到 static/uploads 目录,文件名同上传时使用的文件名
        upload_file.save(os.path.join(app.root_path, app.config['UPLOAD_FOLDER'], filename))
        return 'info is '+request.form.get('info', '')+'. success'
    else:
        return 'failed'
 
 
if __name__ == '__main__':
    app.run(port=5000, debug=True)

URL -变量替代

@app.route('/user/<username>/friends')
def user_friends(username):
    print(username)
    print(type(username))
    return 'In user_friends get username: ' + username


# 转化参数类型
@app.route('/page/<int:num>')  # 转化参数类型  int
def page(num):
    print(num)
    print(type(num))
    return 'hello world'

int    # 接受整数
float     # 同 int ,但是接受浮点数
path     # 和默认的相似,但也接受斜线

重定向 url_for()

from flask import Flask, url_for, redirect

app = Flask(__name__)
 
@app.route('/old')
def old():
    print('this is old')
    # url_for() : 根据方法的函数名 反向定位路由地址
    return redirect(url_for('new'))
    return redict (url_for("new"),id =2)
 
@app.route('/new')
def new():
    print('this is new')
    return 'this is new'
 
if __name__ == '__main__':
    app.run(debug=True)

上下文(Context)
定义:
服务器端获得应用及请求的相关信息的对象。

会话上下文(Sessin Context):基于cookie对象,提供同一客户端在多次请求之间的共享信息方式。

from flask import Flask, session
from datetime import datetime

app = Flask(__name__)

app.secret_key = 'SET_ME_BEFORE_USE_SESSION'

@app.route('/write_session')
def writeSession():
    session['key_time']= datetime.now().strftime('%Y-%m-%d %H:%M:%S')		#将当前时间保存在Session中	
    return session['key_time']  			#返回当前时间
 
@app.route('/read_session')
def readSession():
    return session.get('key_time')			#获得上次调用writeSession时写入的时间,并返回

if __name__ == '__main__':
    app.run()

# new : 判断本次请求的Session是否是新建的
# modified : 判断本次请求是否修改过session键值   (session.modified)

应用全局对象(application Global):提供在一次请求的多个处理函数中共享信息方式。
请求上下文(Request Context):web管理器管理单词用户请求的环境对象,用于处理客户端向 web 服务器发送的数据

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值