当前位置:   article > 正文

python flask简单使用_python flask使用

python flask使用

Flask简介:

官网地址:欢迎来到 Flask 的世界 — Flask 中文文档 (2.0.2)

一个基于python的简单轻便的web应用框架。前端使用jinjia2模板引擎。



使用:

安装:pip install flask

调试运行:python -m 执行文件;  后台运行:nohup python -m 执行文件  >日志文件名.log 2>&1 &

最简单构建例子

  1. from flask import Flask
  2. app = Flask(__name__)
  3. @app.route('/', methods=["GET", "POST"])
  4. def hello_world():
  5. return 'Hello, World!'
  6. if __name__ == '__main__':
  7. app.run(debug=True, host='0.0.0.0', port=5001)

浏览器打开:http//:localhost:5001即可显示文本:Hello, World!

路由:@app.route('/', methods=["GET", "POST"])

路由变量规则,使用<converter:variable_name> 转换器类型

  1. @app.route('/user/<username>')
  2. def show_user_profile(username):
  3. # show the user profile for that user
  4. return 'User %s' % escape(username)
  5. @app.route('/post/<int:post_id>')
  6. def show_post(post_id):
  7. # show the post with the given id, the id is an integer
  8. return 'Post %d' % post_id
  9. @app.route('/path/<path:subpath>')
  10. def show_subpath(subpath):
  11. # show the subpath after /path/
  12. return 'Subpath %s' % escape(subpath)

路由变量转换器类型:

string

(缺省值) 接受任何不包含斜杠的文本

int

接受正整数

float

接受正浮点数

path

类似 string ,但可以包含斜杠

uuid

接受 UUID 字符串

静态文件

默认使用根目录下的 static 文件夹来存储静态文件

调用方法:url_for('static', filename='style.css')

  1. app = flask.Flask(__name__,
  2. static_url_path="", # 指定静态文件 url前缀
  3. static_folder="static", # 指定静态文件目录
  4. template_folder="templates" # 指定模板文件目录
  5. )

渲染前端模板

默认使用项目目录下的 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

  1. # 时间格式转换
  2. @common_blueprint.route('/tools_time/', methods=['POST', 'GET'])
  3. def toosl_time():
  4. if request.method == 'POST':
  5. try:
  6. timestamp = request.values.get('timestamp')
  7. timestr = request.values.get('timestr')
  8. # now_timestamp = request.values.get('now_timestamp')
  9. about_time = AboutTime()
  10. if timestamp:
  11. totimestr = about_time.get_strtime(int(timestamp))
  12. log.info(
  13. " {}, /tools_time/, timestamp:{}, timestr:{}, totimestr:{}".format(request.remote_addr, timestamp,
  14. timestr, totimestr))
  15. return render_template("tongyong.html", timestamp=timestamp, totimestr=totimestr,
  16. user_ip=request.remote_addr)
  17. elif timestr:
  18. totimestamp = about_time.get_to_timestamp(str(timestr))
  19. log.info(
  20. " {}, /tools_time/, timestamp:{}, timestr:{}, totimestamp:{}".format(request.remote_addr, timestamp,
  21. timestr, totimestamp))
  22. return render_template("tongyong.html", timestr=timestr, totimestamp=totimestamp,
  23. user_ip=request.remote_addr)
  24. else:
  25. to_now_timestamp = str(about_time.get_timestamp())
  26. to_now_timestr = str(about_time.get_strtime(about_time.get_timestamp()))
  27. log.info(
  28. " {}, /tools_time/, timestamp:{}, timestr:{}, to_now_timestamp:{}, to_now_timestr:{}".format(
  29. request.remote_addr, timestamp,
  30. timestr, to_now_timestamp, to_now_timestr))
  31. return render_template("tongyong.html", to_now_timestamp=to_now_timestamp,
  32. to_now_timestr=to_now_timestr, user_ip=request.remote_addr)
  33. except Exception as e:
  34. log.error(
  35. " {}, /tools_time/, timestamp:{}, timestr:{},异常信息:{}".format(request.remote_addr, timestamp, timestr,
  36. e))
  37. flash(message="时间转换异常%s" % e)
  38. return render_template("tongyong.html", user_ip=request.remote_addr)

对应前端模板代码  /templates/tongyong.html

  1. <!--时间转换-->
  2. <form method="post" action="/tools_time/">
  3. <label class="item_name">时间戳转换时间:</label>
  4. <input type="text" name="timestamp" value="{{ timestamp }}"
  5. placeholder="timestamp">
  6. <button>提交</button>
  7. <input type="text" name="totimestr" value="{{ totimestr }}" placeholder="totimestr">
  8. <br>
  9. <label class="item_name">时间转换时间戳:</label>
  10. <input type="text" name="timestr" value="{{ timestr }}"
  11. placeholder="timestr">
  12. <button>提交</button>
  13. <input type="text" name="totimestamp" value="{{ totimestamp }}" placeholder="totimestamp">
  14. <br>
  15. <label class="item_name">当前时间/戳:</label>
  16. <button>提交</button>
  17. <input type="text" name="to_now_timestr" value="{{ to_now_timestr }}">
  18. <input type="text" name="to_now_timestamp" value="{{ to_now_timestamp }}">
  19. </form>

1、模板判断方法:使用 {% if 后端返回变量名 %} 开始 ,使用 {% endif %} 结束

  1. <form action="/count_bi_log" method="post" enctype="multipart/form-data">
  2. <input type="file" name="up_file">
  3. <button>上传</button>
  4. {% if bilog_actions %}
  5. <table border="1" bgcolor="#f6f5ec" cellspacing="0" align="center">
  6. <tr>
  7. <th>action_name</th>
  8. <th>统计次数</th>
  9. </tr>
  10. {% for actions in bilog_actions %}
  11. <tr>
  12. <td>{{actions}}</td>
  13. <td>{{bilog_actions[actions]}}</td>
  14. </tr>
  15. {% endfor %}
  16. </table>
  17. {% endif %}
  18. </form>

2、模板for循环方法:使用{% for 变量 in 后端返回迭代对象 %}开始   以{% endfor %}结尾

  1. {% for message in get_flashed_messages() %}
  2. <p style="color:red;"><b>{{ message }}</b></p>
  3. {% endfor %}

3、模板变量使用:使用 {{变量名}}  .  下面代码中的value="{{baiduid}}" 可以显示返回结果

  1. <!--测试环境获取duokuid-->
  2. <form method="post" action="/get_duokuid_qa/">
  3. <label class="item_name">QA duokuid查询</label>&nbsp;&nbsp;
  4. <label>qa_baiduid:</label>
  5. <input type="text" name="baiduid" value="{{baiduid}}" placeholder="输入qa环境baiduid" required="required">
  6. <button>查询</button>
  7. <input type="text" name="duokuid_qa" value="{{duokuid_qa}}" placeholder="显示qa环境duokuid" style="width: 400px">
  8. </form>

4、模板路由引用方法:

1、路由:直接使用路由地址

  1. <!--导航栏-->
  2. <div id="nav_item" class="navicate"
  3. style="background: url(../static/spring.jpg) no-repeat fixed; background-position-y: bottom;">
  4. <div><a href="#" id="nav_userip">{{user_ip}}</a></div>
  5. <div class="nav-item"><a href="#" style="color: #0052CC; background-color: #96BFE5">QA查询</a></div>
  6. <div class="nav-item"><a href="/get_duokuid_online/">线上查询</a></div>
  7. <div class="nav-item"><a href="/tools_time/">通用查询</a></div>
  8. <div class="nav-item"><a href="/cache/">缓存</a></div>
  9. <div class="nav-item"><a href="/download/package/">demo apk</a></div>
  10. </div>

2、静态文件引用  href="{{url_for('static', filename='note.css')}}"    

    url_for("项目下的static目录", filename="static目录下的静态文件名")

  1. <!--便签样式外链地址-->
  2. <link rel="stylesheet" type="text/css" href="{{url_for('static', filename='note.css')}}"/>
  3. <!--导航栏外链地址-->
  4. <link rel="stylesheet" type="text/css" href="{{url_for('static', filename='navicate.css')}}"/>
  5. <!--通用样式外链地址-->
  6. <link rel="stylesheet" type="text/css" href="{{url_for('static', filename='gongyong.css')}}"/>

后端使用

1、重定向  使用 redirect()

  1. from flask import abort, redirect, url_for
  2. @app.route('/')
  3. def index():
  4. return redirect(url_for('login'))

2、主动抛出异常

  1. @app.route('/login')
  2. def login():
  3. abort(401)

3、文件上传

需要设定上传文件目录,允许上传的文件类型

  1. from flask import Flask, flash, request, redirect, url_for
  2. from werkzeug.utils import secure_filename
  3. UPLOAD_FOLDER = '/path/to/the/uploads'
  4. ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'}
  5. app = Flask(__name__)
  6. app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER

获取上传的文件 和文件名

  1. file = request.files['file']
  2. filename = file.filename

上传文件大小限制 下面的代码会把尺寸限制为 16 M

  1. from flask import Flask, Request
  2. app = Flask(__name__)
  3. app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024

模板上传文件  

1、上传类型 enctype="multipart/form-data"

2、上传按钮 <input type="file" name="up_file">

  1. <form action="/upload_package/" method="post" enctype="multipart/form-data">
  2. <input type="file" name="up_file">
  3. <div>apk type:
  4. <label><input type="radio" name="app_type" value="wangyou">网游</label>
  5. <label><input type="radio" name="app_type" value="demo">demo</label>
  6. <label><input type="radio" name="app_type" value="discount">discount</label>
  7. <label><input type="radio" name="app_type" value="others">其他</label>
  8. </div>
  9. <br>
  10. <button>上传</button>
  11. </form>

4、接口参数处理

  1. from flask import jsonify
  2. from faker import Faker
  3. import json
  4. import flask
  5. from flask import request
  6. app = flask.Flask(__name__)
  7. f=Faker(locale='zh_CN')
  8. @app.route("/get/", methods=['GET', 'POST'])
  9. def get():
  10. if request.method == 'POST':
  11. return jsonify({"method": "post", "url": "get", "name": "%s" % f.name(), "token": "random1"})
  12. else:
  13. return jsonify({"method": "get", "url": "get"})
  14. # 通过问号的形式传递参数 例如:http://127.0.0.1:5000/d/?wd=%E7%AE%80%E4%B9%A6&pn=2
  15. @app.route("/get_next/", methods=['GET'])
  16. def get_next():
  17. return jsonify({"url": "get_next", "method": "get", "name": request.args.get("name")})
  18. # 通过url的形式将参数传递 例如 http://127.0.0.1:5000/post/张三
  19. @app.route('/post/<string:name>', methods=['POST'])
  20. def post(name):
  21. return jsonify({"url": "/post/<string:name>", "method": "post", "name": name})
  22. # post 接口传参 参数处理
  23. @app.route("/form/", methods=['POST', 'GET'])
  24. def form():
  25. if request.data:
  26. # data = json.loads(request.get_data().decode("utf-8"))
  27. data = json.loads(request.data.decode("utf-8"))
  28. return jsonify({"url": "/form/", "method": "post", "args": data})
  29. else:
  30. return jsonify({"name": None})

异常处理

  1. from flask import render_template
  2. # 处理url地址未找到
  3. @app.errorhandler(404)
  4. def page_not_found(error):
  5. return render_template('page_not_found.html'), 404

蓝图

1、运行入口

  1. from flask import Flask
  2. import os
  3. from gevent import pywsgi
  4. from scripts.app_download import app_download_blueprint
  5. from scripts.cache import cache_blueprint
  6. from scripts.common import common_blueprint
  7. from scripts.online import online_blueprint
  8. from scripts.public_func import public_blueprint
  9. from scripts.qa import qa_blueprint
  10. from scripts.to_others import to_others_blueprint
  11. app = Flask(__name__) # 实例化flask对象
  12. app.secret_key = 'test'
  13. basedir = os.path.abspath(os.path.dirname(__file__)).replace('\\', '/') # 获取当前项目的绝对路径
  14. file_upload_dir = basedir + '/data/upload/' # 文件上传目录地址
  15. app.register_blueprint(common_blueprint) # 注册通用蓝图
  16. app.register_blueprint(online_blueprint) # 注册线上方法蓝图
  17. app.register_blueprint(qa_blueprint) # 注册测试方法蓝图
  18. app.register_blueprint(cache_blueprint) # 注册测试方法蓝图
  19. app.register_blueprint(public_blueprint) # 注册公共方法蓝图
  20. app.register_blueprint(to_others_blueprint) # 提供给其他服务使用的接口蓝图
  21. app.register_blueprint(app_download_blueprint) # 各种包下载地址
  22. if __name__ == '__main__':
  23. # app.run(debug=True, host='0.0.0.0', port=5005)
  24. server = pywsgi.WSGIServer(("0.0.0.0", 5005), app) # 启动ip和端口
  25. server.serve_forever() # 监听

2、各文件配置(分类路由蓝图注册,便于管理)

  1. from flask import Blueprint, request, render_template
  2. from scripts import log
  3. # 注册蓝图 此蓝图变量后续要在入口执行文件内倒入注册使用
  4. cache_blueprint = Blueprint("cache_blueprint", __name__)
  5. # 使用注册的蓝图引用路由
  6. @cache_blueprint.route("/cache/", methods=['POST', 'GET'])
  7. def cache():
  8. log.info("/cache/, {}".format(request.remote_addr))
  9. return render_template("cache_index.html", user_ip=request.remote_addr)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/474596
推荐阅读
相关标签
  

闽ICP备14008679号