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>
'''实例二'''
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>