Flask的配置與路由

配置管理

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,
   }

複雜的項目須要配置各類環境。若是設置項不多,能夠直接硬編碼進來,好比下面的方式:html

app = Flask(__name__)
app.config['DEBUG'] = True

app.config是flask.config.Config類的實例,繼承自Python內置數據結構dict,因此可使用update方法:java

app.config.update(
    DEBUG = True,
    ...
)

app.config內置的所有配置變量能夠參看Builtin Configuration Values。若是設置選項不少,想要集中管理設置項,應該將他們存放到一個文件裏面。app.config支持多種更新配置的方式。假設如今有個叫作settings.py的配置文件,其中的內容以下:python

A = 1

能夠選擇以下三種方式加載:正則表達式

經過配置文件加載django

# 經過模塊名的字符串
app.config.from_object('settings')  
# 或者:
import settings
app.config.from_object(settings)

經過文件名字加載。可是不限於只使用.py後綴的文件名json

# slient=True該文件不存在時不拋異常,返回False,默認是會拋出異常
app.config.from_pyfile('settings.py',slient=True)

總結flask

==========方式一:============
 app.config['SESSION_COOKIE_NAME'] = 'session_lvning'  #這種方式要把全部的配置都放在一個文件夾裏面,看起來會比較亂,因此選擇下面的方式
==========方式二:==============
app.config.from_pyfile('settings.py')  #找到配置文件路徑,建立一個模塊,打開文件,並獲取全部的內容,再將配置文件中的全部值,都封裝到上一步建立的配置文件模板中

print(app.config.get("CCC"))
=========方式三:對象的方式============
 import os 
 os.environ['FLAKS-SETTINGS'] = 'settings.py'
 app.config.from_envvar('FLAKS-SETTINGS') 

===============方式四(推薦):字符串的方式,方便操做,不用去改配置,直接改變字符串就好了 ==============
app.config.from_object('settings.DevConfig')

----------settings.DevConfig----------
from app import app
class BaseConfig(object):
    NNN = 123  #注意是大寫
    SESSION_COOKIE_NAME = "session_sss"

class TestConfig(BaseConfig):
    DB = "127.0.0.1"

class DevConfig(BaseConfig):
    DB = "52.5.7.5"

class ProConfig(BaseConfig):
    DB = "55.4.22.4"

要想在視圖函數中獲取配置文件的值,都是經過app.config來拿。可是若是視圖函數和Flask建立的對象app不在一個模塊。就得經過導入來拿。能夠不用導入。直接導入一個current_app,這個就是當前的app對象,用current_app.config就能查看到了當前app的全部的配置文件服務器

from flask import Flask,current_app

@app.route('/index',methods=["GET","POST"])
def index():
    print(current_app.config)   #當前的app的全部配置
    session["xx"] = "fdvbn"
    return "index"

路由系統

1.可傳入參數:session

@app.route('/user/<username>')   #經常使用的   不加參數的時候默認是字符串形式的
@app.route('/post/<int:post_id>')  #經常使用的   #指定int,說明是整型的
@app.route('/post/<float:post_id>')
@app.route('/post/<path:path>')
@app.route('/login', methods=['GET', 'POST'])

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

2.反向生成URL: url_for數據結構

endpoint("name")   #別名,至關於django中的name

from flask import Flask, url_for

@app.route('/index',endpoint="xxx")  #endpoint是別名
def index():
    v = url_for("xxx")
    print(v)
    return "index"

@app.route('/zzz/<int:nid>',endpoint="aaa")  #endpoint是別名
def zzz(nid):
    v = url_for("aaa",nid=nid)
    print(v)
    return "index2"

3.  @app.route和app.add_url_rule參數

@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), #當爲False時,url上加不加斜槓都行
                                                訪問 http://www.xx.com/index/ 或 http://www.xx.com/index都可
                                            @app.route('/index',strict_slashes=True)  #當爲True時,url後面必須不加斜槓
                                                僅訪問 http://www.xx.com/index 
            redirect_to=None,           由原地址直接重定向到指定地址,原url有參數時,跳轉到的新url也得傳參,注意:新url中不用指定參數類型,直接用舊的參數的類型
                                        如:
                                            @app.route('/index/<int:nid>', redirect_to='/home/<nid>') # 訪問index時,會直接自動跳轉到home,執行home的函數,
                                                            不執行index的

                          或
                                            def func(adapter, nid):
                                                return "/home/888"
                                            @app.route('/index/<int:nid>', redirect_to=func)

            subdomain=None,             子域名訪問
                                                from flask import Flask, views, url_for

                                                app = Flask(import_name=__name__)
                                                app.config['SERVER_NAME'] = 'haiyan.com:5000'


                                                @app.route("/", subdomain="admin")
                                                def static_index():
                                                    """Flask supports static subdomains
                                                    This is available at static.your-domain.tld"""
                                                    return "admin.xxx.com"

                            #動態生成
                                                @app.route("/dynamic", subdomain="<username>")
                                                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()
        全部的域名都得與IP作一個域名解析:
        若是你想經過域名去訪問,有兩種解決方式:
          方式一:
            一、租一個域名   haiyan.lalala
            二、租一個公網IP  49.8.5.62
            三、域名解析:
                           haiyan.com    49.8.5.62
            四、吧代碼放在49.8.5.62這個服務器上,程序運行起來
              用戶能夠經過IP進行訪問
          方式二:若是是本身測試用的就能夠用這種方式。先在本身本地的文件中找
             C:WindowsSystem32driversetc  找到HOST,修改配置
            而後吧域名修改爲本身的本地服務器127.0.0.1
            加上配置:app.config["SERVER_NAME"] = "haiyan.com:5000"



# =============== 子域名訪問============
@app.route("/static_index", subdomain="admin")
def static_index():
    return "admin.bjg.com"

# ===========動態生成子域名===========
@app.route("/index",subdomain='<xxxxx>')
def index(xxxxx):
    return "%s.bjg.com" %(xxxxx,)

4.自定製正則路由匹配

擴展Flask的路由系統,讓他支持正則,這個類必須這樣寫,必須去繼承BaseConverter

from flask import Flask,url_for
from werkzeug.routing import BaseConverter
    app = Flask(__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

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

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

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

http://docs.jinkan.org/docs/flask/views.html
https://aliang.org/Python/Flask-route.html

原文連接:

https://www.cnblogs.com/huchong/p/8227606.html

 


Flask的配置與路由

識別圖中二維碼,領取python全套視頻資料

相關文章
相關標籤/搜索