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)

 

posted on 2021-04-09 15:32  fengZQ  阅读(127)  评论(0)    收藏  举报

导航