赞
踩
官网地址:欢迎来到 Flask 的世界 — Flask 中文文档 (2.0.2)
一个基于python的简单轻便的web应用框架。前端使用jinjia2模板引擎。
安装:pip install flask
调试运行:python -m 执行文件; 后台运行:nohup python -m 执行文件 >日志文件名.log 2>&1 &
最简单构建例子
- from flask import Flask
- app = Flask(__name__)
-
- @app.route('/', methods=["GET", "POST"])
- def hello_world():
- return 'Hello, World!'
-
- if __name__ == '__main__':
- app.run(debug=True, host='0.0.0.0', port=5001)
浏览器打开:http//:localhost:5001即可显示文本:Hello, World!
路由变量规则,使用<converter:variable_name> 转换器类型
- @app.route('/user/<username>')
- def show_user_profile(username):
- # show the user profile for that user
- return 'User %s' % escape(username)
-
- @app.route('/post/<int:post_id>')
- def show_post(post_id):
- # show the post with the given id, the id is an integer
- return 'Post %d' % post_id
-
- @app.route('/path/<path:subpath>')
- def show_subpath(subpath):
- # show the subpath after /path/
- return 'Subpath %s' % escape(subpath)
路由变量转换器类型:
| (缺省值) 接受任何不包含斜杠的文本 |
| 接受正整数 |
| 接受正浮点数 |
| 类似 |
| 接受 UUID 字符串 |
默认使用根目录下的 static 文件夹来存储静态文件
调用方法:url_for('static', filename='style.css')
- app = flask.Flask(__name__,
- static_url_path="", # 指定静态文件 url前缀
- static_folder="static", # 指定静态文件目录
- template_folder="templates" # 指定模板文件目录
- )
默认使用项目目录下的 templates 文件夹来存储前端模板文件
1、使用 return 返回数据
2、使用 render_template("模板文件名带后缀", 模板内参数名=接口内参数名,模板内参数名=接口内参数名) 方法 渲染模板
3、默认为get请求方法,一般返回不带参数的默认模板。
4、标注post方法时,使用:if request.method == 'POST': # POST 要大写
5、引用前端返回的变量时,使用 request.values.get('前端变量名') # 默认为str格式
6、返回结果时,使用 render_template()方法 ,参数数量任意
7、查看访问者的局域网ip方法:request.remote_addr
- # 时间格式转换
- @common_blueprint.route('/tools_time/', methods=['POST', 'GET'])
- def toosl_time():
- if request.method == 'POST':
- try:
- timestamp = request.values.get('timestamp')
- timestr = request.values.get('timestr')
- # now_timestamp = request.values.get('now_timestamp')
- about_time = AboutTime()
- if timestamp:
- totimestr = about_time.get_strtime(int(timestamp))
- log.info(
- " {}, /tools_time/, timestamp:{}, timestr:{}, totimestr:{}".format(request.remote_addr, timestamp,
- timestr, totimestr))
- return render_template("tongyong.html", timestamp=timestamp, totimestr=totimestr,
- user_ip=request.remote_addr)
- elif timestr:
- totimestamp = about_time.get_to_timestamp(str(timestr))
- log.info(
- " {}, /tools_time/, timestamp:{}, timestr:{}, totimestamp:{}".format(request.remote_addr, timestamp,
- timestr, totimestamp))
- return render_template("tongyong.html", timestr=timestr, totimestamp=totimestamp,
- user_ip=request.remote_addr)
- else:
- to_now_timestamp = str(about_time.get_timestamp())
- to_now_timestr = str(about_time.get_strtime(about_time.get_timestamp()))
- log.info(
- " {}, /tools_time/, timestamp:{}, timestr:{}, to_now_timestamp:{}, to_now_timestr:{}".format(
- request.remote_addr, timestamp,
- timestr, to_now_timestamp, to_now_timestr))
- return render_template("tongyong.html", to_now_timestamp=to_now_timestamp,
- to_now_timestr=to_now_timestr, user_ip=request.remote_addr)
- except Exception as e:
- log.error(
- " {}, /tools_time/, timestamp:{}, timestr:{},异常信息:{}".format(request.remote_addr, timestamp, timestr,
- e))
- flash(message="时间转换异常%s" % e)
- return render_template("tongyong.html", user_ip=request.remote_addr)
对应前端模板代码 /templates/tongyong.html
- <!--时间转换-->
- <form method="post" action="/tools_time/">
- <label class="item_name">时间戳转换时间:</label>
- <input type="text" name="timestamp" value="{{ timestamp }}"
- placeholder="timestamp">
- <button>提交</button>
- <input type="text" name="totimestr" value="{{ totimestr }}" placeholder="totimestr">
- <br>
- <label class="item_name">时间转换时间戳:</label>
- <input type="text" name="timestr" value="{{ timestr }}"
- placeholder="timestr">
- <button>提交</button>
- <input type="text" name="totimestamp" value="{{ totimestamp }}" placeholder="totimestamp">
- <br>
- <label class="item_name">当前时间/戳:</label>
- <button>提交</button>
- <input type="text" name="to_now_timestr" value="{{ to_now_timestr }}">
- <input type="text" name="to_now_timestamp" value="{{ to_now_timestamp }}">
- </form>
1、模板判断方法:使用 {% if 后端返回变量名 %} 开始 ,使用 {% endif %} 结束
- <form action="/count_bi_log" method="post" enctype="multipart/form-data">
- <input type="file" name="up_file">
- <button>上传</button>
- {% if bilog_actions %}
- <table border="1" bgcolor="#f6f5ec" cellspacing="0" align="center">
- <tr>
- <th>action_name</th>
- <th>统计次数</th>
- </tr>
- {% for actions in bilog_actions %}
- <tr>
- <td>{{actions}}</td>
- <td>{{bilog_actions[actions]}}</td>
- </tr>
- {% endfor %}
- </table>
- {% endif %}
- </form>
2、模板for循环方法:使用{% for 变量 in 后端返回迭代对象 %}开始 以{% endfor %}结尾
- {% for message in get_flashed_messages() %}
- <p style="color:red;"><b>{{ message }}</b></p>
- {% endfor %}
3、模板变量使用:使用 {{变量名}} . 下面代码中的value="{{baiduid}}" 可以显示返回结果
- <!--测试环境获取duokuid-->
- <form method="post" action="/get_duokuid_qa/">
- <label class="item_name">QA duokuid查询</label>
- <label>qa_baiduid:</label>
- <input type="text" name="baiduid" value="{{baiduid}}" placeholder="输入qa环境baiduid" required="required">
- <button>查询</button>
- <input type="text" name="duokuid_qa" value="{{duokuid_qa}}" placeholder="显示qa环境duokuid" style="width: 400px">
- </form>
4、模板路由引用方法:
1、路由:直接使用路由地址
- <!--导航栏-->
- <div id="nav_item" class="navicate"
- style="background: url(../static/spring.jpg) no-repeat fixed; background-position-y: bottom;">
- <div><a href="#" id="nav_userip">{{user_ip}}</a></div>
- <div class="nav-item"><a href="#" style="color: #0052CC; background-color: #96BFE5">QA查询</a></div>
- <div class="nav-item"><a href="/get_duokuid_online/">线上查询</a></div>
- <div class="nav-item"><a href="/tools_time/">通用查询</a></div>
- <div class="nav-item"><a href="/cache/">缓存</a></div>
- <div class="nav-item"><a href="/download/package/">demo apk</a></div>
- </div>
2、静态文件引用 href="{{url_for('static', filename='note.css')}}"
url_for("项目下的static目录", filename="static目录下的静态文件名")
- <!--便签样式外链地址-->
- <link rel="stylesheet" type="text/css" href="{{url_for('static', filename='note.css')}}"/>
- <!--导航栏外链地址-->
- <link rel="stylesheet" type="text/css" href="{{url_for('static', filename='navicate.css')}}"/>
- <!--通用样式外链地址-->
- <link rel="stylesheet" type="text/css" href="{{url_for('static', filename='gongyong.css')}}"/>
1、重定向 使用 redirect()
- from flask import abort, redirect, url_for
-
- @app.route('/')
- def index():
- return redirect(url_for('login'))
2、主动抛出异常
- @app.route('/login')
- def login():
- abort(401)
3、文件上传
需要设定上传文件目录,允许上传的文件类型
- from flask import Flask, flash, request, redirect, url_for
- from werkzeug.utils import secure_filename
-
- UPLOAD_FOLDER = '/path/to/the/uploads'
- ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'}
-
- app = Flask(__name__)
- app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
获取上传的文件 和文件名
- file = request.files['file']
- filename = file.filename
上传文件大小限制 下面的代码会把尺寸限制为 16 M
- from flask import Flask, Request
-
- app = Flask(__name__)
- app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024
模板上传文件
1、上传类型 enctype="multipart/form-data"
2、上传按钮 <input type="file" name="up_file">
- <form action="/upload_package/" method="post" enctype="multipart/form-data">
- <input type="file" name="up_file">
- <div>apk type:
- <label><input type="radio" name="app_type" value="wangyou">网游</label>
- <label><input type="radio" name="app_type" value="demo">demo</label>
- <label><input type="radio" name="app_type" value="discount">discount</label>
- <label><input type="radio" name="app_type" value="others">其他</label>
- </div>
- <br>
- <button>上传</button>
- </form>
4、接口参数处理
- from flask import jsonify
- from faker import Faker
- import json
- import flask
- from flask import request
-
- app = flask.Flask(__name__)
- f=Faker(locale='zh_CN')
-
- @app.route("/get/", methods=['GET', 'POST'])
- def get():
- if request.method == 'POST':
- return jsonify({"method": "post", "url": "get", "name": "%s" % f.name(), "token": "random1"})
- else:
- return jsonify({"method": "get", "url": "get"})
-
- # 通过问号的形式传递参数 例如:http://127.0.0.1:5000/d/?wd=%E7%AE%80%E4%B9%A6&pn=2
- @app.route("/get_next/", methods=['GET'])
- def get_next():
- return jsonify({"url": "get_next", "method": "get", "name": request.args.get("name")})
-
- # 通过url的形式将参数传递 例如 http://127.0.0.1:5000/post/张三
- @app.route('/post/<string:name>', methods=['POST'])
- def post(name):
- return jsonify({"url": "/post/<string:name>", "method": "post", "name": name})
-
-
- # post 接口传参 参数处理
- @app.route("/form/", methods=['POST', 'GET'])
- def form():
- if request.data:
- # data = json.loads(request.get_data().decode("utf-8"))
- data = json.loads(request.data.decode("utf-8"))
- return jsonify({"url": "/form/", "method": "post", "args": data})
- else:
- return jsonify({"name": None})
- from flask import render_template
-
- # 处理url地址未找到
- @app.errorhandler(404)
- def page_not_found(error):
- return render_template('page_not_found.html'), 404
1、运行入口
- from flask import Flask
- import os
- from gevent import pywsgi
-
- from scripts.app_download import app_download_blueprint
- from scripts.cache import cache_blueprint
- from scripts.common import common_blueprint
- from scripts.online import online_blueprint
- from scripts.public_func import public_blueprint
- from scripts.qa import qa_blueprint
- from scripts.to_others import to_others_blueprint
-
- app = Flask(__name__) # 实例化flask对象
- app.secret_key = 'test'
- basedir = os.path.abspath(os.path.dirname(__file__)).replace('\\', '/') # 获取当前项目的绝对路径
- file_upload_dir = basedir + '/data/upload/' # 文件上传目录地址
- app.register_blueprint(common_blueprint) # 注册通用蓝图
- app.register_blueprint(online_blueprint) # 注册线上方法蓝图
- app.register_blueprint(qa_blueprint) # 注册测试方法蓝图
- app.register_blueprint(cache_blueprint) # 注册测试方法蓝图
- app.register_blueprint(public_blueprint) # 注册公共方法蓝图
- app.register_blueprint(to_others_blueprint) # 提供给其他服务使用的接口蓝图
- app.register_blueprint(app_download_blueprint) # 各种包下载地址
-
- if __name__ == '__main__':
- # app.run(debug=True, host='0.0.0.0', port=5005)
- server = pywsgi.WSGIServer(("0.0.0.0", 5005), app) # 启动ip和端口
- server.serve_forever() # 监听
2、各文件配置(分类路由蓝图注册,便于管理)
- from flask import Blueprint, request, render_template
- from scripts import log
-
- # 注册蓝图 此蓝图变量后续要在入口执行文件内倒入注册使用
- cache_blueprint = Blueprint("cache_blueprint", __name__)
-
-
- # 使用注册的蓝图引用路由
- @cache_blueprint.route("/cache/", methods=['POST', 'GET'])
- def cache():
- log.info("/cache/, {}".format(request.remote_addr))
- return render_template("cache_index.html", user_ip=request.remote_addr)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。