flask简单认识


flask简单认识

安装虚拟环境

sudo pip3 install virtualenv

安装虚拟环境扩展包

sudo pip3 install virtualenvwrapper

创建python3虚拟环境

mkvirtualenv -p python3 Flask_py3

指定Flask版本安装

$ pip install flask==0.10.1
pip freeze > requirements.txt

Mac系统

easy_install flask==0.10.1

在ipython中测试安装是否成功

from flask import Flask

Python 项目中必须包含一个 requirements.txt 文件,用于记录所有依赖包及其精确的版本号,以便在新环境中进行部署操作。

当需要创建这个虚拟环境的完全副本,可以创建一个新的虚拟环境,并在其上运行以下命令:

pip install -r requirements.txt

使用 methods 参数指定可接受的请求方式,可以是多种

@app.route('/',methods=['GET'])
def hello():
    return '<h1>hello world</h1>'

同一路由指向两个不同的函数,在匹配过程中,至上而下依次匹配,

@app.route('/')
def hello():
    return '<h1>hello world</h1>'

@app.route('/')
def hello_2017():
    return '<h1>hello 2017</h1>'

有时我们需要将同一类URL映射到同一个视图函数处理,比如:使用同一个视图函数 来显示不同用户的个人信息。
路由传递的参数默认当做string处理,这里指定int,尖括号中的内容是动态的,也可不指定类型.

@app.route('/user/<int:id>')
def hello_world(id):
    return 'hello world %d' %id

重定向redirect示例:

from flask import redirect
@app.route('/')
def hello_world():
    return redirect('https://www.baidu.com')

在 Python 中返回状态码有两种方式实现:
- 直接return
- 可以自定义返回状态码,可以实现不符合http协议的状态码,例如:error=666,errmsg=’查询数据库异常’,其作用是为了实现前后端数据交互的方便
- abort方法
- 只会抛出符合http 协议的异常状态码,用于手动抛出异常

@app.route('/')
def hello_world():
    return 'hello world',666

在web开发中,可能会出现限制用户访问规则的场景,那么这个时候就需要用到正则匹配,限制访问,优化访问

导入转换器包

from werkzeug.routing import BaseConverter

自定义转换器包

# 自定义转换器
class Regex_url(BaseConverter):
    def __init__(self,url_map,*args):
    super(Regex_url,self).__init__(url_map)
    self.regex = args[0]
app = Flask(__name__)
app.url_map.converters['re'] = Regex_url
@app.route('/user/<re("[a-z]{3}"):id>')
def hello_world(id):
    return 'hello %s'%id

捕获异常

abort方法

抛出一个给定状态代码的 HTTPException,例如想要用一个页面未找到异常来终止请求,你可以调用 abort(404)。
参数: code – HTTP的错误状态码

@app.route('/abort')
def demo1():
    abort(404)
    #只能抛出HTTP协议的状态码
    return 'hello'

@app.errorhandler(404)
def demo2(e):
    return 'hello'

errorhandler装饰器

注册一个错误处理程序,当程序抛出指定错误状态码的时候,就会调用该装饰器所装饰器的方法

参数:code_or_exception – HTTP的错误状态码或指定异常

例如统一处理状态码为500的错误给用户友好的提示:

@app.errorhandler(500)
def internal_server_error(e):
    return '服务器搬家了'

开启调试模式

可以实现不用重启服务器就能实现当前代码更新时自动上传

1、创建一个.cfg文件内容为:DEBUG=True
app.config.from_pyfile('文件名')
2if __name__ = '__main__'
     app.run(debug = True)
3class MyConfig(object):
    DEBUG=True
app.config.from_object(MyConfig)
4、app.config['DEBUG']=True

装饰器路由的实现

Flask 有两大核心:Werkzeug 和 Jinja2
Werkzeug实现路由、调试和Web服务器网关接口
Jinja2实现模板。
Werkzeug是一个遵循WSGI协议的python函数库
- 其内部实现了很多Web框架底层的东西,比如request和response对象;
-WSGI规范的兼容;支持Unicode- 支持基本的会话管理和签名Cookie- 集成URL请求路由等。

Werkzeug库的routing模块负责实现URL解析。不同的URL对应不同的视图函数,routing模块会对请求信息的URL进行解析,匹配到URL对应的视图函数,以此生成一个响应信息。
routing模块内部有:

- Rule类(用来构造不同的URL模式的对象,保存视图和url的映射关系)
- Map类(存储所有的URL规则)
- BaseConverter的子类(负责定义匹配规则)
- MapAdapter类(负责具体URL匹配的工作)

url_for

from flask import Flask,url_for,redirect
......
@app.route('/',methods=['GET','POST'])
def hello_world():
    return 'Hello World!%s'%request.method

@app.route('/',methods=['GET','POST'])
def hello():
    return 'Hello!'

@app.route('/order,methods=['GET','POST'])
def demo3(order_id):
    return redirect(url_for('hello'))

在此首先访问’/order’,通过url_for找到’hello’函数的url,为’/’,然后找符合此url的视图函数,至上而下依次匹配原则,则运行’hello_world’视图函数。

返回Json

from flask import json,jsonify
---
@app.route('/json',methods=['GET','POST'])
def demo4():
    json_dict = {
        'wxx':123,
        'kjk':678,
    }
    return json.dumps(json_dict)

返回:{"kjk": 678, "wxx": 123}
Content-Type:text/html


--------------------------------------------
@app.route('/json',methods=['GET','POST'])
def demo4():
    json_dict = {
        'wxx':123,
        'kjk':678,
    }
    return jsonify(json_dict)

返回:{
  "kjk": 678, 
  "wxx": 123
}
Content-Type:application/json

request

就是flask中代表当前请求的request对象:

属性说明类型
data记录请求的数据,并转换为字符串*
form记录请求中的表单数据MultiDict
args记录请求中的查询参数MultiDict
cookies记录请求中的cookie信息Dict
headers记录请求中的报文头EnvironHeaders
method记录请求使用的HTTP方法GET/POST
url记录请求的URL地址string
files记录请求上传的文件*
from flask import request
----
@app.route('/updata',methods=['GET','POST'])
def update():
    # 127.0.0.1:5000 / updata ?name = wxx & age = 22
    args = request.args
    name = args.get('name')
    age = args.get('age')
    print name,age
    pic_file = request.files.get('pic')
    pic_file.save('./mm.png')#form-data ,选File模式 上传文件,保存文件
    print ('data%s'%request.data)#raw形式 不是键值对
    return "upload"

注意循环导入

蓝图什么时候注册什么时候导

git提交不上空文件

冗余字段空间换时间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值