FLASK基础

一、配置文件

Flask的配置文件 

app.config     Config对象的本质是一个字典

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["参数"] = value

app.secret_key = value

'''修改配置文件方式一'''
print(app.config.get('DEBUG'))      # False
app.config['DEBUG'] = True   # 修改配置文件的DEBUG属性
print(app.config.get('DEBUG'))      # True

 

方式二:

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("settings.MySetting")        # settings.py的MySetting类

 

 

二、路由

  • @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'])

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

转换器类型,为变量指定规则:

string (缺省值) 接受任何不包含斜杠的文本
int 接受正整数
float 接受正浮点数
path 类似 string ,但可以包含斜杠
uuid 接受 UUID 字符串
DEFAULT_CONVERTERS = {
    'default':          UnicodeConverter,
    'string':           UnicodeConverter,
    'any':              AnyConverter,
    'path':             PathConverter,
    'int':              IntegerConverter,
    'float':            FloatConverter,
    'uuid':             UUIDConverter,
}

示例:

from flask import Flask,redirect,url_for

app = Flask(__name__)

# endpoint 指向函数的名字
@app.route("/book/<int:newid>",endpoint="book")
def book(newid):
    print(newid,type(newid))        # 123 <class 'int'>
    return "Book页面"

# methods= 指定请求方式的列表
@app.route("/",methods=['GET','POST'])  
def index():
    return redirect(url_for("book",newid=123))      # 反向解析

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

 

访问的URL

1.URL 是中规中举的,尾部有一个斜杠,看起来就如同一个文件夹。 访问一个没有斜杠结尾的 URL 时 Flask 会自动进行重定向,帮你在尾部加上一个斜杠。

2. URL 没有尾部斜杠,因此其行为表现与一个文件类似。如果访问这个 URL 时添加了尾部斜杠就会得到一个 404 错误。这样可以保持 URL 唯一,并帮助 搜索引擎避免重复索引同一页面。

三、静态文件

动态的 web 应用也需要静态文件,一般是 CSS 和 JavaScript 文件。理想情况下你的 服务器已经配置好了为你的提供静态文件的服务。但是在开发过程中, Flask 也能做好 这项工作。只要在你的包或模块旁边创建一个名为 static的文件夹就行了。 静态文件位于应用的 /static 中。

使用特定的 'static' 端点就可以生成相应的 URL

url_for('static', filename='style.css')

这个静态文件在文件系统中的位置应该是 static/style.css 。

四、请求和响应

导入request和Response

from flask import Flask,request,Response

# 请求相关信息
# request.method
# request.args
# request.form
# request.values
# request.cookies
# request.headers
# request.path
# request.full_path
# request.script_root
# request.url
# request.base_url
# request.url_root
# request.host_url
# request.host
# request.files
# obj = request.files['the_file_name']
# obj.save('/var/www/uploads/' + secure_filename(f.filename))

# 响应相关信息
# return "字符串"
# return render_template('html模板路径',**{})
# return redirect('/index.html')

# response = make_response(render_template('index.html'))
# response是flask.wrappers.Response类型
# response.delete_cookie('key')
# response.set_cookie('key', 'value')
# response.headers['X-Something'] = 'A value'
# return response

示例:

from flask import Flask
from flask import request,Response
from flask import render_template
from flask import make_response

app = Flask(__name__)

@app.route("/")
def index():
    print(request.method)   # 请求
    '''
    自定义响应
    '''
    response = make_response(render_template("index.html"))
    response.set_cookie("key","value")      # 响应设置cookie
    return response

    # return render_template("index.html")        # 响应

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

五、模板

1、模板的使用

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

2、自定义模板方法

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

'''示例一'''
from flask import Flask
from flask import url_for
from flask import render_template

app = Flask(__name__)

book_list = [
    {"id":1,"title":"python1"},
    {"id":2,"title":"python2"},
    {"id":3,"title":"python3"},
]


@app.route("/book")
def book():
    return render_template("book.html",book_list=book_list)

if __name__ == '__main__':
    app.run()
<!--book.html-->
<!DOCTYPE html>
<html lang="zh-cmn-Hans">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <title>Title</title>
</head>
<body>

{% for book in book_list %}
<p> {{book.title}}</p>
{% endfor %}

</body>
</html>
实例1的HTML
'''实例二'''
from flask import Flask
from flask import render_template

app = Flask(__name__)

mydict = {'key':"value"}

def myfunc():
    return "<h1>函数返回的内容</h1>"

@app.route('/test')
def test():
    return render_template("test.html",**{"mydict":mydict,"myfunc":myfunc})     # 传入的字典需要打散

if __name__ == '__main__':
    app.run()
<!DOCTYPE html>
<html lang="zh-cmn-Hans">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <title>Title</title>
</head>
<body>
<p>{{mydict.get('key')}}0</p>
<p>{{mydict["key"]}}1</p>
{{myfunc()|safe}}
</body>
</html>
实例2的HTML
原文地址:https://www.cnblogs.com/st-st/p/10185943.html