博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
初窥Flask
阅读量:5846 次
发布时间:2019-06-18

本文共 9713 字,大约阅读时间需要 32 分钟。

初窥Flask

Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器。

“微”(micro) 并不表示你需要把整个 Web 应用塞进单个 Python 文件(虽然确实可以 ),也不意味着 Flask 在功能上有所欠缺。微框架中的“微”意味着 Flask 旨在保持核心简单而易于扩展。Flask 不会替你做出太多决策——比如使用何种数据库。而那些 Flask 所选择的——比如使用何种模板引擎——则很容易替换。除此之外的一切都由可由你掌握。如此,Flask 可以与您珠联璧合。

默认情况下,Flask 不包含数据库抽象层、表单验证,或是其它任何已有多种库可以胜任的功能。然而,Flask 支持用扩展来给应用添加这些功能,如同是 Flask 本身实现的一样。众多的扩展提供了数据库集成、表单验证、上传处理、各种各样的开放认证技术等功能。Flask 也许是“微小”的,但它已准备好在需求繁杂的生产环境中投入使用。

1
pip3 install flask
from werkzeug.wrappers import Request, Response@Request.applicationdef hello(request):    return Response('Hello World!')if __name__ == '__main__':    from werkzeug.serving import run_simple    run_simple('localhost', 4000, hello)
 

一. 基本使用

1
2
3
4
5
6
7
8
9
from 
flask 
import 
Flask
app 
= 
Flask(__name__)
 
@app
.route(
'/'
)
def 
hello_world():
    
return 
'Hello World!'
 
if 
__name__ 
=
= 
'__main__'
:
    
app.run()

二、配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
flask中的配置文件是一个flask.config.Config对象(继承字典),默认配置为:
    
{
        
'DEBUG'
:                                get_debug_flag(default
=
False
),  是否开启Debug模式
        
'TESTING'
:                              
False
,                          是否开启测试模式
        
'PROPAGATE_EXCEPTIONS'
:                 
None
,                          
        
'PRESERVE_CONTEXT_ON_EXCEPTION'
:        
None
,
        
'SECRET_KEY'
:                           
None
,
        
'PERMANENT_SESSION_LIFETIME'
:           timedelta(days
=
31
),
        
'USE_X_SENDFILE'
:                       
False
,
        
'LOGGER_NAME'
:                          
None
,
        
'LOGGER_HANDLER_POLICY'
:               
'always'
,
        
'SERVER_NAME'
:                          
None
,
        
'APPLICATION_ROOT'
:                     
None
,
        
'SESSION_COOKIE_NAME'
:                  
'session'
,
        
'SESSION_COOKIE_DOMAIN'
:                
None
,
        
'SESSION_COOKIE_PATH'
:                  
None
,
        
'SESSION_COOKIE_HTTPONLY'
:              
True
,
        
'SESSION_COOKIE_SECURE'
:                
False
,
        
'SESSION_REFRESH_EACH_REQUEST'
:         
True
,
        
'MAX_CONTENT_LENGTH'
:                   
None
,
        
'SEND_FILE_MAX_AGE_DEFAULT'
:            timedelta(hours
=
12
),
        
'TRAP_BAD_REQUEST_ERRORS'
:              
False
,
        
'TRAP_HTTP_EXCEPTIONS'
:                 
False
,
        
'EXPLAIN_TEMPLATE_LOADING'
:             
False
,
        
'PREFERRED_URL_SCHEME'
:                 
'http'
,
        
'JSON_AS_ASCII'
:                        
True
,
        
'JSON_SORT_KEYS'
:                       
True
,
        
'JSONIFY_PRETTYPRINT_REGULAR'
:          
True
,
        
'JSONIFY_MIMETYPE'
:                     
'application/json'
,
        
'TEMPLATES_AUTO_RELOAD'
:                
None
,
    
}
 
方式一:
    
app.config[
'DEBUG'
= 
True
 
    
PS: 由于Config对象本质上是字典,所以还可以使用app.config.update(...)
 
方式二:
    
app.config.from_pyfile(
"python文件名称"
)
        
如:
            
settings.py
                
DEBUG 
= 
True
 
            
app.config.from_pyfile(
"settings.py"
)
 
    
app.config.from_envvar(
"环境变量名称"
)
        
环境变量的值为python文件名称名称,内部调用from_pyfile方法
 
 
    
app.config.from_json(
"json文件名称"
)
        
JSON文件名称,必须是json格式,因为内部会执行json.loads
 
    
app.config.from_mapping({
'DEBUG'
:
True
})
        
字典格式
 
    
app.config.from_object(
"python类或类的路径"
)
 
        
app.config.from_object(
'pro_flask.settings.TestingConfig'
)
 
        
settings.py
 
            
class 
Config(
object
):
                
DEBUG 
= 
False
                
TESTING 
= 
False
                
DATABASE_URI 
= 
'sqlite://:memory:'
 
            
class 
ProductionConfig(Config):
                
DATABASE_URI 
= 
'mysql://user@localhost/foo'
 
            
class 
DevelopmentConfig(Config):
                
DEBUG 
= 
True
 
            
class 
TestingConfig(Config):
                
TESTING 
= 
True
 
        
PS: 从sys.path中已经存在路径开始写
     
 
    
PS: settings.py文件默认路径要放在程序root_path目录,如果instance_relative_config为
True
,则就是instance_path目录

三、路由系统

  • @app.route('/user/<username>')
  • @app.route('/post/<int:post_id>')
  • @app.route('/post/<float:post_id>')
  • @app.route('/post/<path:path>')
  • @app.route('/login', methods=['GET', 'POST'])

常用路由系统有以上五种,所有的路由系统都是基于一下对应关系来处理:

1
2
3
4
5
6
7
8
9
DEFAULT_CONVERTERS 
= 
{
    
'default'
:          UnicodeConverter,
    
'string'
:           UnicodeConverter,
    
'any'
:              AnyConverter,
    
'path'
:             PathConverter,
    
'int'
:              IntegerConverter,
    
'float'
:            FloatConverter,
    
'uuid'
:             UUIDConverter,
}

 

注册路由原理
def auth(func):            def inner(*args, **kwargs):                print('before')                result = func(*args, **kwargs)                print('after')                return result        return inner        @app.route('/index.html',methods=['GET','POST'],endpoint='index')        @auth        def index():            return 'Index'        或                def index():            return "Index"        self.add_url_rule(rule='/index.html', endpoint="index", view_func=index, methods=["GET","POST"])        or        app.add_url_rule(rule='/index.html', endpoint="index", view_func=index, methods=["GET","POST"])        app.view_functions['index'] = index        或        def auth(func):            def inner(*args, **kwargs):                print('before')                result = func(*args, **kwargs)                print('after')                return result        return inner        class IndexView(views.View):            methods = ['GET']            decorators = [auth, ]            def dispatch_request(self):                print('Index')                return 'Index!'        app.add_url_rule('/index', view_func=IndexView.as_view(name='index'))  # name=endpoint        或        class IndexView(views.MethodView):            methods = ['GET']            decorators = [auth, ]            def get(self):                return 'Index.GET'            def post(self):                return 'Index.POST'        app.add_url_rule('/index', view_func=IndexView.as_view(name='index'))  # name=endpoint        @app.route和app.add_url_rule参数:            rule,                       URL规则            view_func,                  视图函数名称            defaults=None,              默认值,当URL中无参数,函数需要参数时,使用defaults={
'k':'v'}为函数提供参数 endpoint=None, 名称,用于反向生成URL,即: url_for('名称') methods=None, 允许的请求方式,如:["GET","POST"] strict_slashes=None, 对URL最后的 / 符号是否严格要求, 如: @app.route('/index',strict_slashes=False), 访问 http://www.xx.com/index/ 或 http://www.xx.com/index均可 @app.route('/index',strict_slashes=True) 仅访问 http://www.xx.com/index redirect_to=None, 重定向到指定地址 如: @app.route('/index/
', redirect_to='/home/
') 或 def func(adapter, nid): return "/home/888" @app.route('/index/
', redirect_to=func) subdomain=None, 子域名访问 from flask import Flask, views, url_for app = Flask(import_name=__name__) app.config['SERVER_NAME'] = 'wupeiqi.com:5000' @app.route("/", subdomain="admin") def static_index(): """Flask supports static subdomains This is available at static.your-domain.tld""" return "static.your-domain.tld" @app.route("/dynamic", subdomain="
") def username_index(username): """Dynamic subdomains are also supported Try going to user1.your-domain.tld/dynamic""" return username + ".your-domain.tld" if __name__ == '__main__': app.run()

 

 自定制正则路由匹配  from flask import Flask, views, url_for            from werkzeug.routing import BaseConverter            app = Flask(import_name=__name__)            class RegexConverter(BaseConverter):                """                自定义URL匹配正则表达式                """                def __init__(self, map, regex):                    super(RegexConverter, self).__init__(map)                    self.regex = regex                def to_python(self, value):                    """                    路由匹配时,匹配成功后传递给视图函数中参数的值                    :param value:                     :return:                     """                    return int(value)                def to_url(self, value):                    """                    使用url_for反向生成URL时,传递的参数经过该方法处理,返回的值用于生成URL中的参数                    :param value:                     :return:                     """                    val = super(RegexConverter, self).to_url(value)                    return val            # 添加到flask中            app.url_map.converters['regex'] = RegexConverter            @app.route('/index/
') def index(nid): print(url_for('index', nid='888')) return 'Index' if __name__ == '__main__': app.run()

 

 

四、模板

1、模板的使用

Flask使用的是Jinja2模板,所以其语法和Django无差别

2、自定义模板方法

Flask中自定义模板方法的方式和Bottle相似,创建一个函数并通过参数的形式传入render_template,如:

》》》》》》HTML
    

自定义函数

{
{ww()|safe}}
 
》》》》》》run.py
#!/usr/bin/env python# -*- coding:utf-8 -*-from flask import Flask,render_templateapp = Flask(__name__)  def wupeiqi():    return '

Wupeiqi

' @app.route('/login', methods=['GET', 'POST'])def login(): return render_template('login.html', ww=wupeiqi) app.run()
 
    
Title {
% macro input(name, type='text', value='') %} {
% endmacro %} {
{ input('n1') }} {
% include 'tp.html' %}

asdf{
{ v.k1}}

 

转载于:https://www.cnblogs.com/yifugui/p/8184527.html

你可能感兴趣的文章
div+css+js 树形菜单
查看>>
android EventBus 3.0 混淆配置
查看>>
我的友情链接
查看>>
DNS区域委派与转发
查看>>
Windows Server 2008 RemoteApp---发布应用程序
查看>>
白帽子技术分析会话劫持实战讲解
查看>>
我的友情链接
查看>>
yum的三种方式
查看>>
人生苦短我用python(02)动态加载模块
查看>>
Redis分布式缓存安装和使用
查看>>
PHP环境搭建:Windows 7下安装配置PHP+Apache+Mysql环境教程以及注意事项
查看>>
20天精通 Windows 8:系列课程资料集
查看>>
html5 <figure> 标签
查看>>
linux的I/O多路转接select的fd_set数据结构和相应FD_宏的实现分析
查看>>
Mysql数据库InnoDB存储引擎的隔离级别
查看>>
开源监控软件 Hyperic 的两种插件
查看>>
TOMCAT
查看>>
删除一个或数个文件
查看>>
无土栽培中的物联网技术应用
查看>>
html入门的一些东西
查看>>