Flask的使用

一、路由系统

1.子域名的配置

"""
可传入的参数:
@app.route('/user/<username>')
            @app.route('/post/<int:post_id>',methods=['GET',"POST"],endpoint='fff')

- subdomain(配置子域名的方法)
            www.baidu.com,
                - 现在本地hosts文件中找IP  C:\Windows\System32\drivers\etc     /etc/hosts
                
            from flask import Flask,render_template,request,redirect,session,url_for

            app = Flask(__name__)
            app.config['SERVER_NAME'] = 'bjg.com:5000'
        
            @app.route("/index",subdomain='<xxxxx>')
            def index(xxxxx):
                return "%s.bjg.com" %(xxxxx,)

            if __name__ == '__main__':
                app.run()
"""
#py
from flask import Flask,render_template,request,redirect,session,url_for

app = Flask(__name__)
app.config['SERVER_NAME'] = 'bjg.com:5000'
@app.route('/index/<int:nid>',methods=['GET',"POST"],endpoint='fff',defaults={'cid':777},strict_slashes=False)
def index(nid,cid):
print(nid,cid)
# v = url_for('fff',nid=888)
# print(v)
return "xxxx"

@app.route('/old',redirect_to='/new')
def old():
return "Old"

# /new
@app.route('/new')
def new():
return 'New'

admin.bjg.com:5000/index
@app.route("/index", subdomain="admin")
def admin_index():
return "admin.bjg.com"

@app.route("/index",subdomain='www')
def index():
return "www.bjg.com"

@app.route("/index",subdomain='<xxxxx>')
def index(xxxxx):
return "%s.bjg.com" %(xxxxx,)

if __name__ == '__main__':
app.run()
 

2.支持正则表达式

'''
        - 扩展Flask的路由系统,让他支持正则
                from flask import Flask,url_for

                app = Flask(__name__)

                # 定义转换的类
                from werkzeug.routing import BaseConverter
                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

                # 添加到converts中
                app.url_map.converters['xxx'] = RegexConverter

                # 进行使用
                @app.route('/index/<xxx("\d+"):nid>',endpoint='xx')
                def index(nid):
                    url_for('xx',nid=123)
                    return "Index"

                if __name__ == '__main__':
                    app.run()
'''
#py
from flask import Flask,url_for

app = Flask(__name__)

# 定义转换的类
from werkzeug.routing import BaseConverter
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

# 添加到converts中
app.url_map.converters['xxx'] = RegexConverter

# 进行使用
@app.route('/index/<xxx("\d+"):nid>',endpoint='xx')
def index(nid):
url_for('xx',nid=123)
return "Index"

if __name__ == '__main__':
app.run()
 

 

二、视图函数

flask除了支持FBV还支持CBV(包括CBV的正则表达式配置)


from flask import Flask,url_for,views

app = Flask(__name__)

# 进行使用
# @app.route('/index',endpoint='xx')
# def index(nid):
##反向生成URL
# url_for('xx',nid=123)
# return "Index"
#
# app.add_url_rule('/index',index)
def auth(func):
def inner(*args, **kwargs):
result = func(*args, **kwargs)
return result
return inner

class IndexView(views.MethodView):
# methods = ['POST']
  #装饰器在CBV中的使用
decorators = [auth,]

def get(self):
v = url_for('index')
print(v)
return "GET"

def post(self):
return "GET"

app.add_url_rule('/index', view_func=IndexView.as_view(name='index'))

if __name__ == '__main__':
app.run()
 

三、请求和响应

使用urllib转换网址上的中文,和16进制

from flask import Flask,url_for,request,redirect,render_template,jsonify,make_response
from urllib.parse import urlencode,quote,unquote
app = Flask(__name__)

@app.route('/index',endpoint='xx')
def index():
    from werkzeug.datastructures import ImmutableMultiDict
    get_data = request.args
    #转化成为字典
    get_dict = get_data.to_dict()
    get_dict['xx'] = '18'
    # 获取URL
    url = urlencode(get_dict)
    print(url)

    print(request.query_string)
    print(request.args)

    val = "%E6%8A%8A%E5%87%A0%E4%B8%AA"
    print(unquote(val))
    #
    # return "Index"

    # return "Index"
    # return redirect()
    # return render_template()
    # return jsonify(name='alex',age='18')

    response = make_response('xxxxx')
    response.headers['xxx'] = '123123'
    return response


if __name__ == '__main__':
    # app.__call__
    app.run()

四、模板语法

和Django基本相同,更贴近Django的基本语法,支持各种数据类型,还支持函数(自定义模板语法)

##################view视图
from flask import Flask,url_for,request,redirect,render_template,jsonify,make_response,Markup
from urllib.parse import urlencode,quote,unquote
app = Flask(__name__)

def test(a1,a2):
    return a1+a2

@app.template_global()
def sb(a1, a2):
    return a1 + a2 + 100


@app.template_filter()
def db(a1, a2, a3):
    return a1 + a2 + a3


@app.route('/index',endpoint='xx')
def index():
    v1 = "字符串"
    v2 = [11,22,33]
    v3 = {'k1':'v1','k2':'v2'}
    v4 = Markup("<input type='text' />")
    return render_template('index.html',v1=v1,v2=v2,v3=v3,v4=v4,test=test)


if __name__ == '__main__':
    # app.__call__
    app.run()
#########模板base###############
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>模板</h1>
    {%block body %} {%endblock%}

</body>
</html>
############继承模板的HTML#################
{% extends 'layout.html'%}

{%block body %}
    {{v1}}

    <ul>
        {% for item in v2 %}
        <li>{{item}}</li>
        {% endfor %}
    </ul>
    {{v2.1}}

    <ul>
        {% for k,v in v3.items() %}
        <li>{{k}}  {{v}}</li>
        {% endfor %}
    </ul>
    {{v3.k1}}
    {{v3.get('k1')}}

    {{v4}}
    <!--{{v4|safe}}-->

    <h1>{{test(1,19)}}</h1>

    {{sb(1,2)}}

    {{ 1|db(2,3)}}


    {% macro xxxx(name, type='text', value='') %}      《鸿》
        <input type="{{ type }}" name="{{ name }}" value="{{ value }}">
        <input type="{{ type }}" name="{{ name }}" value="{{ value }}">
        <input type="{{ type }}" name="{{ name }}" value="{{ value }}">
        <input type="{{ type }}" name="{{ name }}" value="{{ value }}">
    {% endmacro %}

    {{ xxxx('n1') }}


{%endblock%}

五、session

session的配置

from flask import Flask,session,Session
from urllib.parse import urlencode,quote,unquote
from werkzeug.local import LocalProxy
app = Flask(__name__)
app.secret_key ='sdfsdfsdf'
app.config['SESSION_COOKIE_NAME'] = 'session_lvning'
"""
'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,
'PERMANENT_SESSION_LIFETIME':           timedelta(days=31)
"""

@app.route('/index',endpoint='xx')
def index():
    # session本质上操作的是字典,假设session保存在数据库
    # session['xxx'] = 123
    # session['xx1'] = 123
    # session['xx2'] = 123
    # session['xx3'] = 123
    # del session['xx2']
    session['xx3'] = 123
    return "xxx"

if __name__ == '__main__':
    # app.__call__
    app.run()

六、闪现(flash)

传递到下一个跳转页面的数据,但只想保留一次,一般使用session的flash方法

from flask import Flask,session,Session,flash,get_flashed_messages,redirect,render_template,request
app = Flask(__name__)
app.secret_key ='sdfsdfsdf'

@app.route('/users')
def users():
    # msg = request.args.get('msg','')
    # msg = session.get('msg')
    # if msg:
    #     del session['msg']

    v = get_flashed_messages()
    print(v)
    msg = ''
    return render_template('users.html',msg=msg)

@app.route('/useradd')
def user_add():
    # 在数据库中添加一条数据
    # 假设添加成功,在跳转到列表页面时,显示添加成功
    # return redirect('/users?msg=添加成功')
    # session['msg'] = '添加成功'

    flash('添加成功')
    return redirect('/users')


if __name__ == '__main__':
    app.run()

七、类似中间件

from flask import Flask,session,Session,flash,get_flashed_messages,redirect,render_template,request
app = Flask(__name__)
app.secret_key ='sdfsdfsdf'

@app.before_request
def process_request1():
    print('process_request1')

@app.after_request
def process_response1(response):
    print('process_response1')
    return response


@app.before_request
def process_request2():
    print('process_request2')

@app.after_request
def process_response2(response):
    print('process_response2')
    return response


@app.route('/index')
def index():
    print('index')
    return 'Index'

@app.route('/order')
def order():
    print('order')
    return 'order'

@app.route('/test')
def test():
    print('test')
    return 'test'

if __name__ == '__main__':
    app.run()

 

posted @ 2018-01-04 15:57  TAMAYURA  阅读(201)  评论(0编辑  收藏  举报