之前用 Django, 换工作以后公司使用的是Flask, 做一些笔记, 主要是和Django的不同之处
开启debug以后, 开发服务器才会修改代码后自动重启
# -*-coding:utf-8 -*-
from flask import Flask
# 在目录创建一个config.py 配置文件
import config
app = Flask(__name__)
# 设置配置文件config 从 文件中导入
app.config.from_object(config)
# 传递一个参数 __name__
# 1. 方便flask 去寻找资源
# 2. 方便flask插件出现错误的时候, 去寻找错误多所在的位置
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
# 设置开启debug , 在浏览器里显示。
# 开启以后修改代码服务器自动重起(django 同样)
# app.run(debug=True) 一种方法, 不推荐
app.run()
jinja2用法
url_for()函数:
用于url反射, 内部出入视图函数,可以得到视图函数的url路由
<a href="{{ url_for('.services') }}" >services函数的链接</a>
- 用于引用静态文件 url_for(‘静态路径’, ‘文件名称’)
{{ url_for('static', filename='main.css') }}
# 因为flask对静态文件会默认从static文件夹查找, 所以, 可以不写"static"
<script src="{{ res_url_for('t/jquery/jquery.form.js') }}"></script>
- 在视图函数内, 可以用于重定向到某个url视图
return redirect(url_for('重定向函数名'))
<ul><li>动态路由, 类型转换器int, string, float, path
- 在模版中访问字典,和django一样,如访问属性,当然, 也可以通过[‘键’]访问
- for, if 循环和django 一样
- 过滤器, 和django不同:不是使用冒号, 而是以函数的方式传递参数, func(*arg, **kw)
{{ something|default(param) }}
- 模版继承
- *
动态路由
@app.route('/user/<string:username>', method=['get', 'post']) def user(username): return "user name is %s" % username
- 正则表达式路由验证器
from werkzeug.routing import BaseConverter class RegexConverter(BaseConverter): ''' 设置可以用正则表达式, 来规定动态url的输入规则 ''' def __init__(self, url_map, *items): super(BaseConverter, self).__init__() self.regex = items[0] # 注册规则验证 app.url_map.converters['regex'] = RegexConverter
使用正则, 验证动态url输入是否正确
@app.route('/reg_user/<regex("\d{3}"):user_id>') def reg_user(user_id): # user_id 得到的是unicode 对象。 return 'user_id is %d' % int(user_id)
- 验证请求方法是post, get, put…
from flask import request 在函数中判断: if request.method == 'POST': pass
- 写入cookie,
response = make_response(render_template('index.html', title='主页') response.set_cookie('name', '...') return response
- 错误处理函数:
@app.errorhandler(404) def page_not_found(): return render_response(), 404 # 后面是状态码
视图函数内的request
- 从flask 导入request, flask会自动创建request对象
- 获取表单数据: request.form[‘key’]
- *
保存上传文件:永远不要相信客户端发来的文件名
- from werkzeug.utils import secure_filename
- f.save(upload_path, secure_filename(f.filename))