您的位置:首页 > 其它

flask框架运行程序一些知识

2017-12-13 10:59 204 查看
运行flask程序



基本flask代码

form flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'index'
if __name__  == '__main__':
    app.run(debug=True)

url_map 可以将装饰器路由和视图的对应关系保存起来



初始化所用的参数

import_name: 模块名
static_url_path: 静态文件访问前缀
static_folder: 默认‘static’
template_folder: 默认‘templates’

app = Flask(__name__,
            static_url_path='/python',  # 静态文件的前缀
            static_folder='static',  # 静态文件所处于的文件夹
            template_folder='templates'  # 模块文件所处于的文件夹
            )

配置参数  app.config

app.config.from_pyfile(“yourconfig.cfg”)
app.config.from_object()

直接指定某个名字的配置信息
app.config['DEBUG'] = True
读取配置参数

app.config.get()
在视图中 current_app.config.get()

app.run 的参数

app.run(host=”0.0.0.0”, port=5000, debug = True)

路由的定义
使用methods参数可以指定可接受的请求方式

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

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



上面的例子的输出结果就是hello函数的结果
路由传递的参数默认当做string处理,可以指定类型

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

重定向的实例

from
flask
import
redirect
@app.route('/')
def
hello_python():
    return
redirect('www.csdn.net';)

@app.route('/redirect')
def demo4():
    # url_for:取到指定视图函数对应的路由路径
    # return redirect(url_for('demo2'))
    
4000
return redirect(url_for('demo3',order_id='19292')

返回JSON

@app.route('/json')
def demo5():
    json_dict = {
        "name": "nick",
        "age": 18
    }
    return json.dumps(json_dict)
    # return jsonify(json_dict)

json.dumps 和jsonify的区别





返回状态码的两种方式(abort只会抛出符合http协议的异常状态码,用于手动抛出异常)

@app.route('/status_code')
def demo6():
    a = 1 / 0
    return "status_code", 666
@app.route('/abort')
def demo7():
    # 使用 abort 去主动抛出HTTP的异常
    abort(404)
    return 'aa'

使用errorhandler捕获异常和HTTP的状态码

@app.errorhandler(ZeroDivisionError)
def not_found(e):
    return u'除以0了 %s' % e

自定义正则匹配转换

导入转换器包
from
werkzeug.routing
import
BaseConverter

自定义转换器

class RegexConverter(BaseConverter):
    # 定义转换器的规则,regex是父类的属性,重写父类的属性
    # regex = '[0-9]{5}'
    def __init__(self, url_map, *args):
        # 调用super
        super(RegexConverter, self).__init__(url_map)
        # 将参数中的正则表达式提取出来保存到当前类的regex属性上
        self.regex = args[0]
    # 当匹配完成之后,在调用具体的视图函数之前,会调用些方法将匹配结果传入
    # 做最后一处理
    def to_python(self, value):
        print value
        return int(value)
        # return u'哈哈'
    # 在匹配之前会被执行,执行的时候会把参数传入,不关心参数是否符合匹配规则
    # 而这个方法返回了之后才会做真正的路由匹配
    # 在匹配之前做一些数据处理操作,比如说URL编码的操作
    def to_url(self, value):
        return value
将自定义的转换器添加到默认的转换器列表中
app.url_map.converters['re'] = RegexConverter

自带的转换器

DEFAULT_CONVERTERS = {
'default': UnicodeConverter,
'string': UnicodeConverter,
'any': AnyConverter,
'path': PathConverter,
'int': IntegerConverter,
'float': FloatConverter,
'uuid': UUIDConverter,
}

request对象常用属性
属性说明类型
data记录请求的数据,并转换为字符串*
form记录请求中的表单数据MultiDict
args记录请求中的查询参数MultiDict
cookies记录请求中的cookie信息Dict
headers记录请求中的报文头EnvironHeaders
method记录请求使用的HTTP方法GET/POST
url记录请求的URL地址string
files记录请求上传的文件*
使用终端运行flask程序

# 导入相关包
from flask_script import Manager
# 将当前app与manager关联起来
manager = Manager(app)
运行
manager.run()
终端指令  python 文件名.py runserver -h 运行ip地址:端口号(ip地址和端口号为选填,默认为127.0.0.1:5000)

蓝图(Blueprint):
简单来说,Blueprint 是一个存储操作方法的容器,这些操作在这个Blueprint 被注册到一个应用之后就可以被调用,Flask 可以通过Blueprint来组织URL以及处理请求。
blueprint具有的属性:
一个应用可以具有多个Blueprint
可以将一个Blueprint注册到任何一个未使用的URL下比如 “/”、“/sample”或者子域名
在一个应用中,一个模块可以注册多次
Blueprint可以单独具有自己的模板、静态文件或者其它的通用操作方法,它并不是必须要实现应用的视图和函数的
在一个应用初始化时,就应该要注册需要使用的Blueprint
使用蓝图三步走:
创建一个蓝图对象
admin=Blueprint('admin',__name__)
在这个蓝图对象上进行操作,注册路由,指定静态文件夹,注册模板过滤器

@admin.route('/')
def
admin_home():
    return
'admin_home'

在应用对象上注册这个蓝图对象
app.register_blueprint(admin,url\_prefix='/admin')
运行机制
蓝图是保存了一组将来可以在应用对象上执行的操作,注册路由就是一种操作
当在应用对象上调用 route 装饰器注册路由时,这个操作将修改对象的url_map路由表
然而,蓝图对象根本没有路由表,当我们在蓝图对象上调用route装饰器注册路由时,它只是在内部的一个延迟操作记录列表defered_functions中添加了一个项
当执行应用对象的 register_blueprint() 方法时,应用对象将从蓝图对象的 defered_functions 列表中取出每一项,并以自身作为参数执行该匿名函数,即调用应用对象的 add_url_rule() 方法,这将真正的修改应用对象的路由表
蓝图的url前缀
当我们在应用对象上注册一个蓝图时,可以指定一个url_prefix关键字参数(这个参数默认是/)
在应用最终的路由表 url_map中,在蓝图上注册的路由URL自动被加上了这个前缀,这个可以保证在多个蓝图中使用相同的URL规则而不会最终引起冲突,只要在注册蓝图时将不同的蓝图挂接到不同的自路径即可
url_for
url_for('admin.index') # /admin
注册静态路由
和应用对象不同,蓝图对象创建时不会默认注册静态目录的路由。需要我们在 创建时指定 static_folder 参数。
下面的示例将蓝图所在目录下的static_admin目录设置为静态目录

admin = Blueprint("admin",__name__,static_folder='static_admin')
app.register_bl
acb2
ueprint(admin,url_prefix='/admin'

现在就可以使用/admin/static_admin/ 访问static_admin目录下的静态文件了 定制静态目录URL规则 :可以在创建蓝图对象时使用 static_url_path 来改变静态目录的路由。下面的示例将为static_admin文件夹的路由设置为 /lib

admin = Blueprint("admin",__name__,static_folder='static_admin',static_url_path='/lib')
app.register_blueprint(admin,url_prefix='/admin'

设置模版目录
蓝图对象默认的模板目录为系统的模版目录,可以在创建蓝图对象时使用 template_folder 关键字参数设置模板目录

admin = Blueprint('admin',__name__,template_folder='my_templates'

注:如果在templates中存在和my_templates同名文件,则系统会优先使用templates中的文件,在使用templates目录同名的情况下,需要通过路径区分,例如:
my_templates存在两个,若使用admin目录下的my_templates目录,则需要使用如下方式注册:
admin = Blueprint('admin',__name__,template_folder='admin/my_templates'
单元测试:
断言就是判断一个函数或对象的一个方法所产生的结果是否符合你期望的那个结果。 python中assert断言是声明布尔值为真的判定,如果表达式为假会发生异常。单元测试中,一般使用assert来断言结果。



常用的断言方法:

assertEqual     如果两个值相等,则pass
assertNotEqual  如果两个值不相等,则pass
assertTrue      判断bool值为True,则pass
assertFalse     判断bool值为False,则pass
assertIsNone    不存在,则pass
assertIsNotNone 存在,则pas

单元测试准备工作

        # 开启测试模式,如果被测试的代码有错误,会提示被测试的代码哪个位置出错
        app.testing = True
        # 可以直接通过该客户端返回指定地址发起请求
        self.client = app.test_client()
单元测试案例的方法要以 `test` 开头
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  框架