flash 学习笔记
一、安装环境
1. 查看是否安装了virtualenv
virtualenv --version
2. 安装虚拟环境
pip install virtualenv
pip install virtualenvwrapper
3. 若提示找不到mkvirtualenv命令,需配置环境变量
1)创建目录存放虚拟环境
mkdir $HOME/.virtualenvs
2)打开~/.bashrc文件,并添加如下
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
3)运行
source ~./bashrc
4. 安装Flash依赖包
1)安装依赖包
pip install -r requirements.txt
2)生成依赖包
pip freeze > requirements.txt
5. 创建虚拟环境
mkvirtualenv study_flask -p python3
二、视图函数基本方法
# coding=utf-8 from flask import Flask, current_app, redirect, url_for from werkzeug.routing import BaseConverter ############################################################################################################ # 创建flask应用对象 # __name__表示当前模块名字 # 模块名,flask以这个模块所在的目录为总目录 app = Flask( __name__, static_url_path='/urlPath', # 访问静态资源的url前缀,默认值是static static_folder='static', # 静态文件的目录,默认就是static template_folder='templates' # 模板文件的目录,默认是templates ) ############################################################################################################ # 配置参数的使用方式 # 1. 使用文件配置参数 # app.config.from_pyfile('config.cfg') # 2. 使用对象配置参数 # class Config(object): # DEBUG = Truerender_template # MYDATA = 'myData' # # # app.config.from_pyfile('config.cfg') # 3. 直接操作config # app.config['DEBUG'] = True # app.config['MyConfig'] = 'MyConfig' ############################################################################################################ @app.route('/') def index(): # 读取配置参数 # print(current_app.config.get("MyConfig")) # 通过current_app获取配置参数 # print(current_app.config.get("MyConfig")) return 'hello flask' ############################################################################################################ # 通过method指定请求方式 @app.route('/post_and_get', methods=['POST', 'GET']) def post_and_get(): return 'post and get' ############################################################################################################ # 不同的视图函数对应同一个路由时,可以通过不同的请求方式区分 @app.route('/DifferentViewFunctionAndSameRoute', methods=['POST']) def different_view_function1(): return 'DifferentViewFunction1' @app.route('/DifferentViewFunctionAndSameRoute', methods=['GET']) def different_view_function2(): return 'DifferentViewFunction2' ############################################################################################################ # 同一个视图函数定义不同的路由 @app.route('/SameViewFunctionAndDifferentRoute1') @app.route('/SameViewFunctionAndDifferentRoute2') def same_view_function(): return 'SameViewFunctionAndDifferentRoute' ############################################################################################################ @app.route('/login') def login(): # url = '/post_and_get' # 使用url_for函数,通过视图函数名字找到对应的路径。此种方式便于代码维护——当视图函数的路由改变时,不用url的值 url = url_for('post_and_get') return redirect(url) ############################################################################################################
关于path数据类型,在主文件中定义如下的代码:
@app.route('/article/<path:test>/') # path数据类型可接受带“/”的字符串
def test_article(test):
return 'test_article:{}'.format(test)
# flask中通过转换器接受参数 # @app.route('/register/<int:user_id>') @app.route('/register/<user_id>') # 不加类型,默认为str类型(除"/"外的所有字符) def register(user_id): return '注册用户为:% s' % str(user_id) ############################################################################################################ # 1、自定义自己的转换器(正则万能转化器) class RegexConverter(BaseConverter): def __init__(self, url_map, regex): # 掉用父类中的初始化方法 super(RegexConverter, self).__init__(url_map) # 将正则表达式参数保存到对象属性,flask会使用这个属性进行路由的正则匹配 self.regex = regex def to_python(self, value): # value是在路径进行正则表达式匹配的时候提取的参数 return value def to_url(self, value): # 在使用url_for方法时被调用 return value # 2、将自定义转换器添加到flask应用中 app.url_map.converters['re'] = RegexConverter # 3、使用 @app.route('/send/<re(r"1[345678]\d{9}"):mobile>') def send_sms(mobile): return 'send sms to %s ' % mobile # 测试自定义类型中如何使用url_for @app.route('/test_for_url') def test_for_url(): url = url_for('send_sms', mobile='13717640000') # /send/ return redirect(url) ############################################################################################################ if __name__ == '__main__': # 通过app.url_map查看整个flask中的路由信息 # print(app.url_map) app.run(host='172.29.0.71', port=5000)
三、request相关
# coding=utf-8 from flask import Flask, request, abort, Response ############################################################################################################ # 创建flask应用对象 # __name__表示当前模块名字 # 模块名,flask以这个模块所在的目录为总目录 app = Flask(__name__) ############################################################################################################ # http://xxx?data=123,其中data为查询字符串(QueryString) @app.route('/index', methods=['POST', 'GET']) def index(): # request中包含了前端发过来的所有请求数据,可以分别通过data、form、args、cookies、headers、method、files、url获取 # 通过request.form.get可以提取请求体的表单格式的数据,是一个类字典的对象;如果提交的表单数据有重复参数,取到的是第一个。 # name = request.form.get('name') # age = request.form.get('age') # name_list = request.form.getlist('name') # print(name_list) # 通过request.data.get可以提取请求体的json格式的数据 # name = request.data.get('name') # age = request.data.get('age') # 通过request.args.get取查询字符串的值 name = request.args.get('name') age = request.args.get('age') name_list = request.args.getlist('name') print(name_list) # 通过method获取请求HTTP方法 if request.method == 'GET': pass elif request.method == 'POST': pass return '名字:%s,年龄:%s' % (name, str(age)) ############################################################################################################ # 上传文件 @app.route('/upload', methods=['POST']) def upload(): file_obj = request.files.get('file') if file_obj is None: return '文件上传失败' # 将文件保存在本地 # # 1. 创建文件 # f = open('./file01.png', 'wb') # # 2. 向文件写内容 # data = file_obj.read() # f.write(data) # # 关闭文件 # f.close() file_obj.save('./file01.png') return '上传成功' ############################################################################################################ # abort函数可以立即终止视图函数的执行,并可以返回给前端特定的信息 @app.route('/login') def test_login(): # name = request.form.get('name') # pwd = request.form.get('pwd') name = '' pwd = '' if name == 'zhangSan': # 1.传递刚状态码,必须是标准的http状态码 abort(502) elif pwd != 'admin': # 2.传递响应信息 resp = Response('login failed') abort(resp) return 'login success' ############################################################################################################ # 自定义错误处理方法 @app.errorhandler(404) def handle_error(err): # 这个函数的返回值会是前端用户看到的最终结果 return '自定义处理错误方法返回的结果,错误信息:%s' % err ############################################################################################################ if __name__ == '__main__': # print(app.url_map) app.run(host='172.29.0.71', port=5000, debug=True)
四、response相关
# coding=utf-8 from flask import Flask, make_response, jsonify import json ############################################################################################################ # 创建flask应用对象 # __name__表示当前模块名字 # 模块名,flask以这个模块所在的目录为总目录 app = Flask(__name__) ############################################################################################################ # 使用元组返回自定义的信息(return返回一个对象,不加括号默认以元组形式返回) @app.route('/index') def index(): # 第一部分为返回给前端的内容; # 第二部分为状态码,可以是非标准自定义的状态码,传字符串中间以空格分隔说明状态码信息; # 第三部分是响应头中的键值对,可以是列表或者字典 # return 'index page', 202, [('header1', '1'), ('header2', 2)] # return 'index page', 700, {'header3': 3, 'header4': '4'} return 'index page', '700 self status', {'header3': 3, 'header4': '4'} ############################################################################################################ # 使用flask中的make_response @app.route('/index2') def index2(): resp = make_response('index page2') resp.status = '800 self status' resp.headers['headers5'] = 5 resp.headers['headers6'] = 6 return resp ############################################################################################################ # 返回json @app.route('/json') def return_json(): data = { 'return1': 'json1', 'return2': 2 } json_str = json.dumps(data) return json_str, 200, {'Content-Type': 'application/json'} ############################################################################################################ # 使用flask中的jsonify @app.route('/json2') def return_json2(): data = { 'return3': 'json3', 'return4': 4 } # jsonify帮助转化json数据,并设置响应头 Content-Type:application/json # return jsonify(data) return jsonify(return5='json5', return6=6) ############################################################################################################ if __name__ == '__main__': # print(app.url_map) app.run(host='192.168.0.105', port=5000, debug=True) # app.run(host='172.29.0.71', port=5000, debug=True)
五、cookie相关
# coding=utf-8 from flask import Flask, make_response, request import json ############################################################################################################ # 创建flask应用对象 # __name__表示当前模块名字 # 模块名,flask以这个模块所在的目录为总目录 app = Flask(__name__) ############################################################################################################ # 使用元组返回自定义的信息(return返回一个对象,不加括号默认以元组形式返回) @app.route('/index') def index(): # 第一部分为返回给前端的内容; # 第二部分为状态码,可以是非标准自定义的状态码,传字符串中间以空格分隔说明状态码信息; # 第三部分是响应头中的键值对,可以是列表或者字典 # return 'index page', 202, [('header1', '1'), ('header2', 2)] # return 'index page', 700, {'header3': 3, 'header4': '4'} return 'index page', '700 self status', {'header3': 3, 'header4': '4'} ############################################################################################################ # 设置cookie @app.route('/set_cookie') def set_cookie(): resp = make_response('set cookie') # 设置cookie,默认为临时cookie,浏览器关闭即失效。 resp.set_cookie('cookie1', '1') resp.set_cookie('cookie2', '2') # 通过max_age设置cookie有效期,单位为秒 resp.set_cookie('cookie3', '3', max_age=3600) return resp ############################################################################################################ # 获取cookie @app.route('/get_cookie') def get_cookie(): c = request.cookies.get('cookie3') return c ############################################################################################################ # 删除cookie @app.route('/del_cookie') def del_cookie(): resp = make_response('del cookie') resp.delete_cookie('cookie3') return resp ############################################################################################################ if __name__ == '__main__': # print(app.url_map) app.run(host='192.168.0.105', port=5000, debug=True) # app.run(host='172.29.0.71', port=5000, debug=True)
浙公网安备 33010602011771号