基本使用

  1. from flask import Flask
  2. app = Flask(__name__)
  3. @app.route('/')
  4. def hello_world():
  5. return 'Hello World!'
  6. if __name__ == '__main__':
  7. app.run()

配置文件

在app 中引入

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

settings

  1. class BaseConfig(object):
  2. DEBUG = True
  3. SECRET_KEY = "随机字符串"
  4. class ProductionConfig(BaseConfig):
  5. DEBUG = False
  6. class DevelopmentConfig(BaseConfig):
  7. pass
  8. class TestingConfig(BaseConfig):
  9. pass

路由

  1. a. 添加路由的两种方式:
  2. from flask import Flask,render_template,redirect
  3. app = Flask(__name__)
  4. """
  5. 1. 执行decorator=app.route('/index',methods=['GET','POST'])
  6. 2. @decorator
  7. - decorator(index)
  8. """
  9. # 路由方式一(*):
  10. @app.route('/index',methods=['GET','POST'])
  11. def index():
  12. return "Index"
  13. # 路由方式二:
  14. def order():
  15. return 'Order'
  16. app.add_url_rule('/order',view_func=order)
  17. if __name__ == '__main__':
  18. app.run()
  19. b. endpoint(默认函数名)
  20. c. 传参数
  21. @app.route('/index/<int:nid>',methods=['GET','POST'])
  22. def index(nid):
  23. print(nid,type(nid))
  24. url_for('index',nid=888)
  25. return "Index"
  26. d. 自定义正则参数
  27. from flask import Flask,render_template,redirect,url_for
  28. from werkzeug.routing import BaseConverter
  29. app = Flask(__name__)
  30. class RegexConverter(BaseConverter):
  31. """
  32. 自定义URL匹配正则表达式
  33. """
  34. def __init__(self, map, regex):
  35. super(RegexConverter, self).__init__(map)
  36. self.regex = regex
  37. def to_python(self, value):
  38. """
  39. 路由匹配时,匹配成功后传递给视图函数中参数的值
  40. :param value:
  41. :return:
  42. """
  43. return int(value)
  44. def to_url(self, value):
  45. """
  46. 使用url_for反向生成URL时,传递的参数经过该方法处理,返回的值用于生成URL中的参数
  47. :param value:
  48. :return:
  49. """
  50. val = super(RegexConverter, self).to_url(value)
  51. return val
  52. app.url_map.converters['xxx'] = RegexConverter
  53. @app.route('/index/<xxx("\d+"):nid>',methods=['GET','POST'])
  54. def index(nid):
  55. print(nid,type(nid))
  56. v = url_for('index',nid=999) # /index/999
  57. print(v)
  58. return "Index"
  59. if __name__ == '__main__':
  60. app.run()
  61. e. 其他参数
  62. - 重定向
  63. from flask import Flask,render_template,redirect
  64. app = Flask(__name__)
  65. @app.route('/index',methods=['GET','POST'],redirect_to='/new')
  66. def index():
  67. return "老功能"
  68. @app.route('/new',methods=['GET','POST'])
  69. def new():
  70. return '新功能'
  71. if __name__ == '__main__':
  72. app.run()
  73. PS: 前端重定向
  74. - meta/js
  75. 重点:
  76. - url
  77. - methods
  78. - endpoint
  79. - @app.route('/index/<int:nid1>/<int:nid2>/')
  80. - url_for

视图函数

fbv(常用)

  1. import functools
  2. def wapper(func):
  3. @functools.wraps(func)
  4. def inner(*args,**kwargs):
  5. print('before')
  6. return func(*args,**kwargs)
  7. return inner
  8. @app.route('/xxxx',methods=['GET','POST'])
  9. @wapper
  10. def index():
  11. return "Index"

cbv

  1. class IndexView(views.MethodView):
  2. methods = ['GET']
  3. decorators = [wapper, ]
  4. def get(self):
  5. return 'Index.GET'
  6. def post(self):
  7. return 'Index.POST'
  8. app.add_url_rule('/index', view_func=IndexView.as_view(name='index2')) # name=endpoint

请求和响应

请求相关

  1. request.method
  2. request.args
  3. request.form
  4. request.cookies
  5. request.headers
  6. request.path
  7. request.files
  8. obj = request.files['the_file_name']
  9. obj.save('/var/www/uploads/' + secure_filename(obj.filename))
  10. request.values
  11. request.full_path
  12. request.script_root
  13. request.url
  14. request.base_url
  15. request.url_root
  16. request.host_url
  17. request.host

响应相关

  1. return ""
  2. return json.dumps({}) # return jsonify({})
  3. return render_template('index.html',n1=123)
  4. return redirect('/index')
  5. response = make_response(render_template('index.html'))
  6. response = make_response("xxxx")
  7. response.set_cookie('key', 'value')
  8. response.headers['X-Something'] = 'A value'
  9. response.delete_cookie('key')
  10. return response

模板

调用方法基本和Django相同

session

  • 设置:session['username'] = 'xxx'
  • 删除:session.pop('username', None)

蓝图(Blueprint)

目录结构



manage.py

  1. from s8pro import app
  2. if __name__ == '__main__':
  3. app.run()

init.py

  1. from flask import Flask
  2. from .views import account
  3. from .views import admin
  4. from .views import user
  5. app = Flask(__name__)
  6. app.register_blueprint(account.ac)
  7. app.register_blueprint(admin.ad)
  8. app.register_blueprint(user.us)

views 文件夹内

1.account.py

  1. from flask import Blueprint,render_template
  2. import redis
  3. ac = Blueprint('ac',__name__)
  4. @ac.route('/login')
  5. def login():
  6. conn = redis.Redis()
  7. return render_template('login.html')
  8. @ac.route('/logout')
  9. def logout():
  10. return '退出'

2.admin.py

  1. from flask import Blueprint
  2. ad = Blueprint('ad',__name__,url_prefix='/admin')
  3. @ad.before_request
  4. def bf():
  5. print('before_request')
  6. @ad.route('/home')
  7. def home():
  8. return 'home'
  9. @ad.route('/xxxx')
  10. def xxxx():
  11. return 'xxxx'

3.user.py

  1. from flask import Blueprint
  2. us = Blueprint('us',__name__)
  3. @us.route('/info')
  4. def info():
  5. return 'info'

前缀和子域名

  1. 蓝图URL前缀:xxx = Blueprint('account', __name__,url_prefix='/xxx')
  2. 蓝图子域名:xxx = Blueprint('account', __name__,subdomain='admin')
  3. # 前提需要给配置SERVER_NAME: app.config['SERVER_NAME'] = 'xxx.com:5000'
  4. # 访问时:admin.xxx.com:5000/login.html

闪现(message)

  1. message是一个基于Session实现的用于保存数据的集合
  2. 其特点是:使用一次就删除。
  3. @app.route('/x1',methods=['GET','POST'])
  4. def login():
  5. flash('我要上学校1',category='x1')
  6. flash('我要上学校2',category='x2')
  7. return "视图函数x1"
  8. @app.route('/x2',methods=['GET','POST'])
  9. def index():
  10. data = get_flashed_messages(category_filter=['x1'])
  11. print(data)
  12. return "视图函数x2"

中间件

  1. class Middleware(object):
  2. def __init__(self,old_wsgi_app):
  3. """
  4. 服务端启动时,自动执行
  5. :param old_wsgi_app:
  6. """
  7. self.old_wsgi_app =old_wsgi_app
  8. def __call__(self, environ, start_response):
  9. """
  10. 每次有用户请求道来时
  11. :param args:
  12. :param kwargs:
  13. :return:
  14. """
  15. print('before')
  16. from flask import session,request
  17. obj = self.old_wsgi_app(environ, start_response)
  18. print('after')
  19. return obj
  20. if __name__ == '__main__':
  21. app.wsgi_app = Middleware(app.wsgi_app)
  22. app.run()
  23. """
  24. 1.执行app.__call__
  25. 2.再调用app.wsgi_app方法
  26. """

常见装饰器

  1. @app.before_request 每次请求进来之前执行
  2. @app.after_request 每次请求进来之后执行
  3. @app.errorhandler(404) 引发404错误时候执行
  4. @app.before_first_request 第一次请求进来之前执行(如创建数据库连接池这样的业务)
  5. @app.template_global() 调用方法{{函数名(参数1,参数2)}}
  6. @app.template_filter() 调用方法{{参数1|函数名(参数2,参数3))}}

Flask 通关攻略大全的更多相关文章

  1. imToken 测评通关攻略

    imToken 测评通关攻略 2017-10-19 imToken 在 1.3.3 版本新增了用户风险测评系统, 目的是为了让更多的用户了解钱包安全知识以及区块链的基本概念, 从某种程度上提升了整个区 ...

  2. Upload-labs 文件上传靶场通关攻略(上)

    Upload-labs 文件上传靶场通关攻略(上) 文件上传是Web网页中常见的功能之一,通常情况下恶意的文件上传,会形成漏洞. 逻辑是这样的:用户通过上传点上传了恶意文件,通过服务器的校验后保存到指 ...

  3. upload-labs通关攻略(1-11关)

    upload-labs通关攻略 upload-labs是练习文件上传很好的一个靶场,建议把upload-labs关卡全部练习一遍 1.下载安装 下载地址 链接:https://pan.baidu.co ...

  4. upload-labs通关攻略(全)

    upload-labs通关攻略 upload-labs是练习文件上传很好的一个靶场,建议把upload-labs关卡全部练习一遍 1.下载安装 下载地址 链接:https://pan.baidu.co ...

  5. DQ8通关攻略

    <勇者斗恶龙8>作为勇者斗恶龙系列首次实现3D的一作,游戏无论是从画面.音效还是游戏系统都表现非常不俗,这款游戏也是PS2主机上必玩的一款大作. 作为PS2平台上唯一一款勇者斗恶龙的正传新 ...

  6. Upload-labs 文件上传靶场通关攻略(下)

    Upload-Labs靶场攻略(下) Pass-11 GET型传参,上传目录可设置,考虑00截断,在/upload/后添加1.php%00,即可上传 Pass-12 POST型传参,上传目录可设置,P ...

  7. Untrusted 游戏 通关攻略

    这个游戏还不错,用了两个晚上的时间通过并写下解法.这个游戏通过修改JS代码来通关的游戏.很考验玩家的解决问题能力,同时也有一定的可玩性. 游戏地址 http://alexnisnevich.githu ...

  8. Omi教程-通讯通讯攻略大全

    组件通讯 Omi框架组建间的通讯非常遍历灵活,因为有许多可选方案进行通讯: 通过在组件上声明 data-* 传递给子节点 通过在组件上声明 data 传递给子节点 (支持复杂数据类型的映射) 父容器设 ...

  9. 打怪升级之路—Security+认证通关攻略(401还是501)

    我花了一个月才把题目过完一遍的(这一个月都上班,下班抽空做几页),这里面走了很多弯路,我把备考过程整理出来希望对大家有帮助. 我是在2019年1月完成的Security+考试,离安全牛课堂直播培训结束 ...

随机推荐

  1. python的变量类型(Day6)

    Python的变量类型 变量可以指定不同的数据类型,这些变量可以存储整数,小数或字符. 变量赋值 Python 中的变量赋值不需要类型声明 等号(=)用来给变量赋值,等号左边为变量值,等号右边是存储在 ...

  2. Nhibernate工具Profiler配置

    1.使用之前需要确认Framework的Version,如果是4.0那么使用如下程序集需要在 创建ISessionFactory的项目中引用NHProfiler安装目录下的 HibernatingRh ...

  3. python之路 前段之html,css

    一.HTML 超级文本标记语言是标准通用标记语言下的一个应用,也是一种规范,一种标准, 它通过标记符号来标记要显示的网页中的各个部分.网页文件本身是一种文本文件,通过在文本文件中添加标记符,可以告诉浏 ...

  4. mac相关记录

    一.设置允许安装任何来源软件 命令行执行: sudo spctl --master-disable -----------------------------

  5. 部署 LAMP (CentOS 7.2),摘自阿里云,方便查看使用

    原文地址:https://help.aliyun.com/document_detail/50774.html?spm=5176.product25365.6.728.C9s3V8 简介 LAMP指L ...

  6. Linux服务器配置秘钥对连接

    [root@check2 ~]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to sa ...

  7. python标准库学习-ftplib

    源码: """An FTP client class and some helper functions. Based on RFC 959: File Transfer ...

  8. tar 解压命令学习与总结

    tar -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个 ...

  9. DIKW:数据、信息、知识、智慧的金字塔层次体系

    http://www.ciotimes.com/ProCase/85417.html 前言 知识对于个人.组织的重要性已经不言而喻.可以说,管理与应用知识的能力已经成为企业的核心竞争力. 知识如此重要 ...

  10. java 实现JSON数据格式化

    关键在于好的算法这个代码来源于网络,算法已在注释中添加. 工具地址: 链接:https://pan.baidu.com/s/1Ns3cqi0SG3qSqatrZBrl4A 提取码:2enp 复制这段内 ...