Flask的使用
一、路由系统
1.子域名的配置
"""
可传入的参数:
@app.route('/user/<username>')
@app.route('/post/<int:post_id>',methods=['GET',"POST"],endpoint='fff') - subdomain(配置子域名的方法)
www.baidu.com,
- 现在本地hosts文件中找IP C:\Windows\System32\drivers\etc /etc/hosts from flask import Flask,render_template,request,redirect,session,url_for app = Flask(__name__)
app.config['SERVER_NAME'] = 'bjg.com:5000' @app.route("/index",subdomain='<xxxxx>')
def index(xxxxx):
return "%s.bjg.com" %(xxxxx,) if __name__ == '__main__':
app.run() """
#py
from flask import Flask,render_template,request,redirect,session,url_for app = Flask(__name__)
app.config['SERVER_NAME'] = 'bjg.com:5000'
@app.route('/index/<int:nid>',methods=['GET',"POST"],endpoint='fff',defaults={'cid':777},strict_slashes=False)
def index(nid,cid):
print(nid,cid)
# v = url_for('fff',nid=888)
# print(v)
return "xxxx" @app.route('/old',redirect_to='/new')
def old():
return "Old" # /new
@app.route('/new')
def new():
return 'New' admin.bjg.com:5000/index
@app.route("/index", subdomain="admin")
def admin_index():
return "admin.bjg.com" @app.route("/index",subdomain='www')
def index():
return "www.bjg.com" @app.route("/index",subdomain='<xxxxx>')
def index(xxxxx):
return "%s.bjg.com" %(xxxxx,) if __name__ == '__main__':
app.run()
2.支持正则表达式
'''
- 扩展Flask的路由系统,让他支持正则
from flask import Flask,url_for app = Flask(__name__) # 定义转换的类
from werkzeug.routing import BaseConverter
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['xxx'] = RegexConverter # 进行使用
@app.route('/index/<xxx("\d+"):nid>',endpoint='xx')
def index(nid):
url_for('xx',nid=123)
return "Index" if __name__ == '__main__':
app.run()
'''
#py
from flask import Flask,url_for app = Flask(__name__) # 定义转换的类
from werkzeug.routing import BaseConverter
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['xxx'] = RegexConverter # 进行使用
@app.route('/index/<xxx("\d+"):nid>',endpoint='xx')
def index(nid):
url_for('xx',nid=123)
return "Index" if __name__ == '__main__':
app.run()
二、视图函数
flask除了支持FBV还支持CBV(包括CBV的正则表达式配置)
from flask import Flask,url_for,views app = Flask(__name__) # 进行使用
# @app.route('/index',endpoint='xx')
# def index(nid):
##反向生成URL
# url_for('xx',nid=123)
# return "Index"
#
# app.add_url_rule('/index',index)
def auth(func):
def inner(*args, **kwargs):
result = func(*args, **kwargs)
return result
return inner class IndexView(views.MethodView):
# methods = ['POST']
#装饰器在CBV中的使用
decorators = [auth,] def get(self):
v = url_for('index')
print(v)
return "GET" def post(self):
return "GET" app.add_url_rule('/index', view_func=IndexView.as_view(name='index')) if __name__ == '__main__':
app.run()
三、请求和响应
使用urllib转换网址上的中文,和16进制
from flask import Flask,url_for,request,redirect,render_template,jsonify,make_response
from urllib.parse import urlencode,quote,unquote
app = Flask(__name__) @app.route('/index',endpoint='xx')
def index():
from werkzeug.datastructures import ImmutableMultiDict
get_data = request.args
#转化成为字典
get_dict = get_data.to_dict()
get_dict['xx'] = ''
# 获取URL
url = urlencode(get_dict)
print(url) print(request.query_string)
print(request.args) val = "%E6%8A%8A%E5%87%A0%E4%B8%AA"
print(unquote(val))
#
# return "Index" # return "Index"
# return redirect()
# return render_template()
# return jsonify(name='alex',age='18') response = make_response('xxxxx')
response.headers['xxx'] = ''
return response if __name__ == '__main__':
# app.__call__
app.run()
四、模板语法
和Django基本相同,更贴近Django的基本语法,支持各种数据类型,还支持函数(自定义模板语法)
##################view视图
from flask import Flask,url_for,request,redirect,render_template,jsonify,make_response,Markup
from urllib.parse import urlencode,quote,unquote
app = Flask(__name__) def test(a1,a2):
return a1+a2 @app.template_global()
def sb(a1, a2):
return a1 + a2 + 100 @app.template_filter()
def db(a1, a2, a3):
return a1 + a2 + a3 @app.route('/index',endpoint='xx')
def index():
v1 = "字符串"
v2 = [11,22,33]
v3 = {'k1':'v1','k2':'v2'}
v4 = Markup("<input type='text' />")
return render_template('index.html',v1=v1,v2=v2,v3=v3,v4=v4,test=test) if __name__ == '__main__':
# app.__call__
app.run()
#########模板base###############
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>模板</h1>
{%block body %} {%endblock%} </body>
</html>
############继承模板的HTML#################
{% extends 'layout.html'%} {%block body %}
{{v1}} <ul>
{% for item in v2 %}
<li>{{item}}</li>
{% endfor %}
</ul>
{{v2.1}} <ul>
{% for k,v in v3.items() %}
<li>{{k}} {{v}}</li>
{% endfor %}
</ul>
{{v3.k1}}
{{v3.get('k1')}} {{v4}}
<!--{{v4|safe}}--> <h1>{{test(1,19)}}</h1> {{sb(1,2)}} {{ 1|db(2,3)}} {% macro xxxx(name, type='text', value='') %} 《鸿》
<input type="{{ type }}" name="{{ name }}" value="{{ value }}">
<input type="{{ type }}" name="{{ name }}" value="{{ value }}">
<input type="{{ type }}" name="{{ name }}" value="{{ value }}">
<input type="{{ type }}" name="{{ name }}" value="{{ value }}">
{% endmacro %} {{ xxxx('n1') }} {%endblock%}
五、session
session的配置
from flask import Flask,session,Session
from urllib.parse import urlencode,quote,unquote
from werkzeug.local import LocalProxy
app = Flask(__name__)
app.secret_key ='sdfsdfsdf'
app.config['SESSION_COOKIE_NAME'] = 'session_lvning'
"""
'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,
'PERMANENT_SESSION_LIFETIME': timedelta(days=31)
""" @app.route('/index',endpoint='xx')
def index():
# session本质上操作的是字典,假设session保存在数据库
# session['xxx'] = 123
# session['xx1'] = 123
# session['xx2'] = 123
# session['xx3'] = 123
# del session['xx2']
session['xx3'] = 123
return "xxx" if __name__ == '__main__':
# app.__call__
app.run()
六、闪现(flash)
传递到下一个跳转页面的数据,但只想保留一次,一般使用session的flash方法
from flask import Flask,session,Session,flash,get_flashed_messages,redirect,render_template,request
app = Flask(__name__)
app.secret_key ='sdfsdfsdf' @app.route('/users')
def users():
# msg = request.args.get('msg','')
# msg = session.get('msg')
# if msg:
# del session['msg'] v = get_flashed_messages()
print(v)
msg = ''
return render_template('users.html',msg=msg) @app.route('/useradd')
def user_add():
# 在数据库中添加一条数据
# 假设添加成功,在跳转到列表页面时,显示添加成功
# return redirect('/users?msg=添加成功')
# session['msg'] = '添加成功' flash('添加成功')
return redirect('/users') if __name__ == '__main__':
app.run()
七、类似中间件
from flask import Flask,session,Session,flash,get_flashed_messages,redirect,render_template,request
app = Flask(__name__)
app.secret_key ='sdfsdfsdf' @app.before_request
def process_request1():
print('process_request1') @app.after_request
def process_response1(response):
print('process_response1')
return response @app.before_request
def process_request2():
print('process_request2') @app.after_request
def process_response2(response):
print('process_response2')
return response @app.route('/index')
def index():
print('index')
return 'Index' @app.route('/order')
def order():
print('order')
return 'order' @app.route('/test')
def test():
print('test')
return 'test' if __name__ == '__main__':
app.run()
Flask的使用的更多相关文章
- flask+sqlite3+echarts2+ajax数据可视化
前提: 准备Python + Flask+Sqlite3的平台环境(windows系统) 前面一节介绍flask怎么安装了,剩下sqlite3下载后解压,然后环境变量添加解压路径就行了 附加下载地址: ...
- flask+sqlite3+echarts2+ajax数据可视化报错:UnicodeDecodeError: 'utf8' codec can't decode byte解决方法
flask+sqlite3+echarts2+ajax数据可视化报错: UnicodeDecodeError: 'utf8' codec can't decode byte 解决方法: 将 py文件和 ...
- Windows下快速安装Flask的一次经历
前提: 1.已安装python版本(一般都是2.X) 2.已安装easy_install python安装,记得配置Python的环境变量,例如:我的直接在Path上加 G:\Python 验证安装P ...
- 使用Flask设计带认证token的RESTful API接口[翻译]
上一篇文章, 使用python的Flask实现一个RESTful API服务器端 简单地演示了Flask实的现的api服务器,里面提到了因为无状态的原则,没有session cookies,如果访问 ...
- 使用python的Flask实现一个RESTful API服务器端[翻译]
最近这些年,REST已经成为web services和APIs的标准架构,很多APP的架构基本上是使用RESTful的形式了. 本文将会使用python的Flask框架轻松实现一个RESTful的服务 ...
- python flask (一)
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello World ...
- flask源码分析
本flask源码分析不间断更新 而且我分析的源码全是我个人觉得是很beautiful的 1 flask-login 1.1 flask.ext.login.login_required(func),下 ...
- Python flask 基于 Flask 提供 RESTful Web 服务
转载自 http://python.jobbole.com/87118/ 什么是 REST REST 全称是 Representational State Transfer,翻译成中文是『表现层状态转 ...
- Python flask @app.route
转载自 http://python.jobbole.com/80956/ 下面是Flask主页给我们的第一个例子,我们现在就由它入手,深入理解“@app.route()”是如何工作的. ...
- Flask 框架入门
Flask Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 . 安装 Flask 依赖两个外部库, We ...
随机推荐
- 硬盘SMART参数解释
Raw Read Error Rate 底层读取错误率,高值暗示盘体/磁头有问题 Throughput Performance 读写通量性能 (越高越好) ...
- C#删除WebBrowser控件Session
转载:http://www.hackdig.com/?02/hack-1464.htm 因为要搞一个类似帐号多开的小辅助,但是很坑爹的发现,在一个WebBrowser中,就算重新登录,显示的仍然是上一 ...
- 53环境Jenkins新增工程配置
1. 登录http://10.179.175.53:8080/环境. 2. 点击新建任务,输入任务名称,并在复制一个NOS的类似工程即可. 3. 在配置页面,修改源码地址: 4. 点击完成,执行构建, ...
- centos中进程管理工具
进程管理: 二进制的格式为ELF,是CPU指令集中的指令 程序=指令+数据, 进程是程序的副本,可以有多个 内核是一个资源调度监视器 Linux是抢占式多任务 内存被事先划分成多个相同大小 ...
- Oracle入门概述
--学习数据库--数据查询语言:select语句--数据操纵语言:DML,增删改语句--数据定义语言:DDL,对表的增删改(会自动提交事务)--事务控制语句:commit,rollback,savep ...
- 关于ftp上传changeWorkingDirectory()方法的路径切换问题
在上传时 FTPClient提供了upload方法,对于upload(file,path)的第二个参数path ,上传到哪里的这个路径, ftp是利用changeWorkingDirectory()方 ...
- PHP共享内存详解
前言 在PHP中有这么一族函数,他们是对UNIX的V IPC函数族的包装. 它们很少被人们用到,但是它们却很强大.巧妙的运用它们,可以让你事倍功半. 它们包括: 信号量(Semaphores) 共享内 ...
- Coursera台大机器学习技法课程笔记05-Kernel Logistic Regression
这一节主要讲的是如何将Kernel trick 用到 logistic regression上. 从另一个角度来看soft-margin SVM,将其与 logistic regression进行对比 ...
- jq中Deferred对象的使用
var d=$.Deferred(); //deferred下面的方法有: // ["resolve", "resolveWith", "reject ...
- hdu3282 链表或者对顶堆
维护序列的动态中位数 第一次用链表做题..感觉指针指来指去也挺麻烦的.. 本题链表解法就是用数组模拟出一个链表,然后离线输入所有数,排序,按照输入顺序在链表里删除元素,一次性删掉两个,然后中位数指针对 ...