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 ...
随机推荐
- 【vim】实时加密文本 ggVGg?
如果你不想让别人看懂你的屏幕上的内容,你可以使用一个内置的选项,通过下面的命令使用 ROT13 来对文本进行编码: ggVGg? gg 把光标移动到 Vim 缓冲区的第一行, V 进入可视模式, G ...
- k64 datasheet学习笔记3---Chip Configuration之System modules
1.前言 本文主要介绍芯片配置的系统模块的内容 2.SIM配置 TODO 3.SMC配置 TODO 4.PMC配置 TODO 5.LOW-LEAKAGE WAKEUP单元配置 TODO 6.MCM配置 ...
- 手把手教你写makefile【原创】
Makefile 编写 Make -f makefile1 指定 如下是 本人的一点makefile学习笔记,再分享一个不错的写makefile总结的网址: http://www.cnblogs ...
- nodejs 在线学习课堂
http://ww***/class/5359f6f6ec7452081a7873d8
- 高级 Java 面试通关知识点整理!
1.常用设计模式 单例模式:懒汉式.饿汉式.双重校验锁.静态加载,内部类加载.枚举类加载.保证一个类仅有一个实例,并提供一个访问它的全局访问点. 代理模式:动态代理和静态代理,什么时候使用动态代理. ...
- SpringMVC中fastjson支持jsonp的实现
前边一篇文章主要说了下前端处理jsonp的方式,这篇主要介绍了后台接收和响应jsonp的一种方式 继承fastjson消息转换器类:com.alibaba.fastjson.support.sprin ...
- javascript 类型比较方法
不要使用new Number().new Boolean().new String()创建包装对象: 用parseInt()或parseFloat()来转换任意类型到number: 用String() ...
- 用jquery添加新元素很容易,面对jquery append 动态添加的元素事件on 不起作用我们该如何解决呢?
用jquery添加新元素很容易,面对jquery append 动态添加的元素事件on 不起作用我们该如何解决呢?on方法中要先找到原选择器(如例.info),再找到动态添加的选择器(如列.delet ...
- webpack中的output.filename 和output.chunkFilename
filename应该比较好理解,就是对应于entry里面生成出来的文件名.比如: { entry: { "index": "pages/index.jsx" } ...
- C++ one more time
写在前面:我们学习程序设计的方法先是模仿,然后举一反三.在自己的知识面还没有铺开到足够解决本领域的问题时,不要将精力过分集中于对全局无足轻重的地方!!! 以下参考钱能老师的<C++程序设计教程 ...