flask快速入门

1.1.三种框架比较

Django: 重武器,内部包含了非常多组件:ORM、Form、ModelForm、缓存、Session、中间件、信号等

Flask:短小精悍,内部没有太多组件,第三方组件非常丰富。路由比较特殊,是基于装饰器来实现,但是本质还是通过add_url_rule来实现的

Tornado:异步非阻塞

1.2.安装和运行

(1)安装

创建虚拟环境,然后直接安装

mkvirtualenv flask_project

pip install -i https://pypi.douban.com/simple flask

(2)运行

基本使用

from flask import Flask

#实例化flask对象
app = Flask(__name__) #将'/'和函数index的对应关系加到路由中
@app.route('/')
def index():
return 'Hello World!' if __name__ == '__main__':
#监听用户请求
#如果有用户请求到来,则执行app的__call__方法,app.__call__
app.run()

浏览器访问:http://127.0.0.1:5000/

1.3.快速入门实例

(1)view.py

from flask import Flask,render_template,request,redirect,session,url_for

app = Flask(__name__)
app.debug = True
app.secret_key = 'abcdef' USERS = {
1:{'name':'derek','age':18},
2:{'name':'tom','age':20},
3:{'name':'jack','age':22},
} @app.route('/detail/<int:nid>',methods=['GET'])
def detail(nid):
# 没登录不能访问
user = session.get('user_info')
if not user:
return redirect('/login')
info = USERS.get(nid)
return render_template('detail.html',info=info) @app.route('/index',methods=['GET'])
def index():
#没登录不能访问
user = session.get('user_info')
if not user:
# return redirect('/login')
#根据设置的别名反向生成url
url = url_for('login11')
return redirect(url)
return render_template('index.html',user_dict=USERS) @app.route('/login',methods=['GET','POST'],endpoint='login11') #endpoint起别名
def login():
if request.method == 'GET':
return render_template('login.html')
else:
user = request.form.get('user')
pwd = request.form.get('pwd')
if user == 'derek' and pwd == '':
#添加session值
user = session['user_info'] = user
return redirect('/index')
return render_template('login.html',error='用户名或密码错误') if __name__ == '__main__':
app.run()

(2)templates/login.html

   <h1>用户登录</h1>
<form method="post">
<input type="text" name="user">
<input type="text" name="pwd">
<input type="submit" value="登录">
{{error}}
</form>

(3)templates/index.html

   <h1>用户登录</h1>
<table>
{% for k,v in user_dict.items() %}
<tr>
<td>{{k}}</td>
<td>{{v.name}}</td>
<td>{{v['name']}}</td>
<td>{{v.get('name')}}</td>
<td><a href="/detail/{{k}}">查看详细</a></td>
</tr>
{% endfor %}
</table>

(4)templates/detail.html

    {{info.name}}
{{info.age}}

1.4.配置文件

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

flask配置文件

(1)方式一

app.debug = True

(2)方式二

app.config['DEBUG'] = True

(3)方式三(最常用)

app.config.from_object("settings.DevelopmentConfig")

settings.py

一个父类,其它子类继承,重写父类的某个方法    

class Config(object):
DEBUG = False
TESTING = False
DATABASE_URI = 'sqlite://:memory:' class ProductionConfig(Config):
DATABASE_URI = 'mysql://user@localhost/foo' class DevelopmentConfig(Config):
DEBUG = True class TestingConfig(Config):
TESTING = True

1.5.路由系统本质

(1)常用路由系统有以下五种

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

基本上这五种方式满足大多数需求,还可以自定制正则路由

from flask import Flask, views, url_for
from werkzeug.routing import BaseConverter app = Flask(import_name=__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 # 添加到flask中
app.url_map.converters['regex'] = RegexConverter @app.route('/index/<regex("\d+"):nid>')
def index(nid):
print(url_for('index', nid=''))
return 'Index' if __name__ == '__main__':
app.run() b. 自定制正则路由匹配

自定制正则路由

(2)路由系统的本质

from flask import Flask,render_template,request,redirect,session,url_for

app = Flask(__name__)
app.debug = True
app.secret_key = 'abcdef' #源码分析
'''
路由本质,通过看源码分析得出,其本质是通过add_url_rule来实现的 1.decorator = app.route('/',methods=['GET','POST'],endpoint='index') def route(self, rule, **options):
#app对象(即self)
#rule=/
#option = methods=['GET','POST'],endpoint='index'
def decorator(f):
endpoint = options.pop('endpoint', None)
self.add_url_rule(rule, endpoint, f, **options)
return f
return decorator 2.@decorator
decorator(index)
''' @app.route('/',methods=['GET','POST'],endpoint='index')
def index():
return 'Hello word' def login():
return '登录' #通过分析源码,路由可以用下面这种方式实现
app.add_url_rule('/login','login11',login,methods=['GET','POST'],) #第二个参数是别名,第三个参数是视图函数,如果endpoint不写,则默认endpoint='视图函数名' if __name__ == '__main__':
app.run()

1.6.flask之CBV

from flask import Flask,render_template,request,redirect,session,url_for,views

app = Flask(__name__)
app.debug = True
app.secret_key = 'abcdef' def auth(func):
def inner(*args, **kwargs):
result = func(*args, **kwargs)
return result
return inner class IndexView(views.MethodView):
methods = ['GET']
decorators = [auth, ] def get(self):
return 'Index.GET' def post(self):
return 'Index.POST' app.add_url_rule('/index', view_func=IndexView.as_view(name='index')) # name=endpoint if __name__ == '__main__':
app.run()

1.7.add_url_role参数介绍

@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),
访问 http://www.xx.com/index/ 或 http://www.xx.com/index均可
@app.route('/index',strict_slashes=True)
仅访问 http://www.xx.com/index
redirect_to=None, 重定向到指定地址
如:
@app.route('/index/<int:nid>', redirect_to='/home/<nid>')

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'] = 'wupeiqi.com:5000' @app.route("/", subdomain="admin")
def static_index():
"""Flask supports static subdomains
This is available at static.your-domain.tld"""
return "static.your-domain.tld" @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()

所有参数

(1)最基本的url几种方式

from flask import Flask,views
app = Flask(__name__)
app.debug = True
app.secret_key = 'abcdef' #第一种
@app.route('/',methods=['GET','POST'],endpoint='index')
def index():
return 'Hello World!' def login():
return '登录' #第二种
app.add_url_rule('/login','login',login,methods=['GET','POST']) def auth(func):
def inner(*args, **kwargs):
result = func(*args, **kwargs)
return result
return inner #CBV的模式
class DetailView(views.MethodView):
methods = ['GET']
decorators = [auth, ] def get(self):
return 'Detail.GET' def post(self):
return 'Detail.POST' #第三种
app.add_url_rule('/detail', view_func=DetailView.as_view(name='detail')) # name=endpoint if __name__ == '__main__':
app.run()

(2)参数defaults

默认值,当URL中无参数,函数需要参数时,使用defaults={'k':'v'}为函数提供参数

(3)参数strict_slashes=None

#对URL最后的 / 符号是否严格要求,默认为False,如:
@app.route('/index', strict_slashes=False) #下面两种方式都可以访问
http: // www.xx.com / index /
http: // www.xx.com / index #如果设为True
@app.route('/index', strict_slashes=True) #只能这样访问
http: // www.xx.com / index

(4)redirect_to=None

重定向到指定地址

@app.route('/index',methods=['GET','POST'],endpoint='index1',redirect_to="/index2")
def index():
return '公司旧网页' @app.route('/index2',methods=['GET','POST'],endpoint='index2',)
def index():
return '公司新网页'

访问:http://127.0.0.1:5000/index会直接重定向到http://127.0.0.1:5000/index2

1.8.模板语言

flask的模板语法和Django的语法差不多,下面一个简单实例

Markup等价于Django的mark_safe

前端也是用 |safe

from flask import Flask,render_template,Markup

app = Flask(__name__)
app.debug = True
app.secret_key = 'abcdef' def func1(arg):
return Markup("<input type='text' value='%s' />"%arg) @app.route('/')
def index():
return render_template('index.html',func1=func1) if __name__ == '__main__': app.run()

index.html

{{func1('zhang ')}}     <!--传参数arg  -->

 1.9.请求与响应

from flask import Flask
from flask import request
from flask import render_template
from flask import redirect
from flask import make_response app = Flask(__name__) @app.route('/login.html', methods=['GET', "POST"])
def login(): # 请求相关信息
# 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 return "内容" if __name__ == '__main__':
app.run()

请求与响应

1.10.flash介绍

(1)简单使用方法

from flask import Flask,flash,get_flashed_messages

app = Flask(__name__)
app.debug = True
app.secret_key = 'abcdef' @app.route('/get')
def get():
data = get_flashed_messages()
print(data)
return 'hello world' @app.route('/set')
def set():
#向某个地方设置一个值
flash('访问一次就设置一次')
return 'hello world' if __name__ == '__main__':
app.run()

访问:http://127.0.0.1:5000/set     访问一个就会设置一次值

 访问:http://127.0.0.1:5000/get     从某个地方获取所有的值,并清除

Flask快速入门的更多相关文章

  1. 【转】Flask快速入门

    迫不及待要开始了吗?本页提供了一个很好的 Flask 介绍,并假定你已经安装好了 Flask.如果没有,请跳转到 安装 章节. 一个最小的应用 一个最小的 Flask 应用看起来会是这样: from ...

  2. 【先验知识归纳】Flask快速入门

    本文参考:快速入门 - Flask 0.10.1 文档 路由 Flask使用route修饰器来关联URL与程序函数: @app.route('/') def hello_world(): return ...

  3. Flask快速入门,知识整理

    一.Flask介绍(轻量级的框架,非常快速的就能把程序搭建起来) Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是 ...

  4. Flask官方文档学习-flask快速入门

    环境搭建 下载安装Python3:www.python.org 终端运行命令:python3 -m venv flask_dev,来创建虚拟环境 启用虚拟环境,终端使用命令 source /flask ...

  5. Flask 快速入门

    最简单的flask程序 from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return ...

  6. 二 Flask快速入门

    1: 外部可访问的服务器: 如果你运行了这个服务器,你会发现它只能从你自己的计算机上访问,网络中其它任何的地方都不能访问.在调试模式下,用户可以在你的计算机上执行任意 Python 代码.因此,这个行 ...

  7. flask 快速入门链接

    http://docs.jinkan.org/docs/flask/quickstart.html

  8. Flask简介,安装,demo,快速入门

    1.Flask简介 Flask是一个相对于Django而言轻量级的Web框架. 和Django大包大揽不同,Flask建立于一系列的开源软件包之上,这其中 最主要的是WSGI应用开发库Werkzeug ...

  9. pthon web框架flask(二)--快速入门

    快速入门 迫切希望上手?本文提供了一个很好的 Flask 介绍.假设你已经安装 Flask, 如果还没有安装话,请浏览下 安装 . 一个最小的应用 一个最小的应用看起来像这样: from flask ...

随机推荐

  1. Guava 教程(3):Java 的函数式编程,通过 Google Collections 过滤和调用

    原文出处: oschina 在本系列博客的第一.二部分,我介绍了非常优秀的Google Collections和Guava包.本篇博客中我们来看看如何使用Google Collections来做到过滤 ...

  2. OC学习之道:关于Block的初级学习

    [objc] view plaincopy "code" class="OC"> // //  main.m //  Copyright (c) 2015 ...

  3. How to create DB2 user function easily by DB Query Analyzer 6.03

    How to create DB2user function easily by DB Query Analyzer 6.03 Ma Genfeng (Guangdong Unitoll Servic ...

  4. Android 自定义View -- 简约的折线图

    转载请注明出处:http://write.blog.csdn.net/postedit/50434634 接上篇 Android 圆形百分比(进度条) 自定义view 昨天分手了,不开心,来练练自定义 ...

  5. Ext JS 5初探(三)

    在上文提到了本地化文件的问题,然后在Ext JS 5的包里找了找,居然还没包含本地化包.我估计目前还不到考虑本地化的时候.在Sencha Touch中,是没有本地化包的,但是要让Ext JS也不包含本 ...

  6. 虚拟机安装Ubuntu14.04打开FireFox提示Server not found

    虚拟机安装Ubuntu14.04打开FireFox提示Server not found 我采用VMware安装ubuntu14.04的,VMware的网络是配置采用NAT模式(用于共享主机的IP地址) ...

  7. java语法部分一些小问题

    由于本人是个初学者希望自己的文章不会误导广大"群众",如果有错误之处还望前辈指出.谢谢! 一.键盘录入. A:导包 格式: import java.util.Scanner; 位置 ...

  8. JFinal开发环境搭建,JFinal开发案例

     JFinal  是基于 Java  语言的极速  WEB  + ORM  开发框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restful.在拥有Java 语言所 ...

  9. python实现博客自动刷点击脚本

    #A Auto-Visit Web Site Tool import urllib import time import random print "Auto Click the WebPa ...

  10. 【42】android Context深度剖析

    android程序和java程序的区别 Android程序不像Java程序一样,随便创建一个类,写个main()方法就能跑了,而是要有一个完整的Android工程环境,在这个环境下,我们有像Activ ...