Flask

匿名 (未验证) 提交于 2019-12-02 23:49:02

一、Flask了解

    #flask是一个基于python开发并且依赖jinja2和Werkzeug服务的微型框架     对于werkzeug本质是socket服务端,其用于接收http请求并对请求进行预处理,然后触发flask框架,开发人员基于flask框架提供的功能对请求进行相应的处理,并返回给客户,如果返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户的浏览器      “微(micro)”并不代表你需要把整个web应用塞进单个python文件(虽然确实可以),也不意味着flask在功能上有所欠缺,微框架中的“微"意味着flask旨在保持核心简单而易于扩展,Flask 不会替你做出太多决策――比如使用何种数据库。而那些  Flask 所选择的――比如使用何种模板引擎――则很容易替换。除此之外的一切都由可由你掌握。如此,Flask 可以与您珠联璧合。       默认情况下,Flask 不包含数据库抽象层、表单验证,或是其它任何已有多种库可以胜任的功能。然而,Flask  支持用扩展来给应用添加这些功能,如同是 Flask  本身实现的一样。众多的扩展提供了数据库集成、表单验证、上传处理、各种各样的开放认证技术等功能。Flask  也许是“微小”的,但它已准备好在需求繁杂的生产环境中投入使用
View Code

1、安装

pip3 install flask

2、werkzeug简介

安装flask后自动就有werkzeug Werkzeug是一个WSGI工具包,他可以作为一个Web框架的底层库。这里稍微说一下, werkzeug 不是一个web服务器,也不是一个web框架,而是一个工具包,官方的介绍说是一个 WSGI 工具包,它可以作为一个 Web 框架的底层库,因为它封装好了很多 Web 框架的东西,例如 Request,Response 等等 
from werkzeug.wrappers import Response,Request  @Request.application def hello(request):       #wsgi协议需要两个参数,env和response,这里只有一个参数,不符合该协议,     #werkzeug是个工具包,在wsgi基础上又做了封装,所以传一个参数就行      def hello(request):            return Response('Hello World!')      if __name__ == '__main__':         from werkzeug.serving import run_simple         run_simple('localhost', 4000, hello)   #三个参数分别是跑的地址,跑的端口,最后一个是可调用对象
werkzeug

3、对比django

#对应django中的三件套  Httprespose        '' render                 render_template redirect               redirect JsonResponse       jsonify

二、flask的使用

1、flask最简单的模板

from flask import Flask # 实例化产生一个Flask对象 app = Flask(__name__)  #flask的路由是基于装饰器的 @app.route('/')  def hello_world():     return 'Hello World!'  if __name__ == '__main__':     app.run()      # 看源码发现,最终调用了werkzeug的run_simple()

2、flask登陆

from flask import Flask, request, render_template, redirect  app = Flask(__name__) USERS = {     1: {'name': '张三', 'age': 18, 'gender': '男', 'text': "道路千万条"},     2: {'name': '李四', 'age': 28, 'gender': '男', 'text': "安全第一条"},     3: {'name': '王五', 'age': 18, 'gender': '女', 'text': "行车不规范"}, }   #methods=['GET','POST'] 该路由运行get请求和post请求,没写默认只允许get请求 @app.route('/login', methods=['GET', 'POST']) def login():     if request.method == 'GET':  # HTML文件放在templates(自己创建的)中,实例化的过程中app=Flask(__name__),点Flask进去,看到template_folder="templates",          return render_template('login.html')     else:  # request.form相当于django中的POST,注意不是from.是form         name = request.form.get('name')         pwd = request.form.get('pwd')         if name == 'pdun' and pwd == '123':             return redirect('/')         else:  # django中传字典,这里传字典打散,**字典             return render_template('login.html', error="用户名或密码错误")   @app.route('/') def index():     return render_template('index.html', user=USERS)   @app.route('/detail/<int:id>') def detail(id):     user = USERS[id]     return render_template('detail.html', user=user)   if __name__ == '__main__':     app.run()
View Code

需要的HTML

#detail.HTML <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <title>Title</title> </head> <body> <h1>详细信息 {{user.name}}</h1>     <div>         {{user.text}}     </div> </body> </html>   #index.HTML <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <title>Title</title> </head> <body>     <table>         {% for k,v in user.items() %}         <tr>             <td>{{k}}</td>            #三种取值方式             <td>{{v.name}}</td>             <td>{{v['name']}}</td>             <td>{{v.get('name')}}</td>             <td><a href="/detail/{{k}}">查看详细</a></td>         </tr>         {% endfor %}     </table> </body> </html>      #login.HTML <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <title>Title</title> </head> <body>     <h1>用户登录</h1>     <form method="post">         <input type="text" name="name">         <input type="text" name="pwd">         <input type="submit" value="登录">{{error}}     </form> </body> </html>
3个HEML都在这

3、配置文件

#方式一       app.config['DEBUG'] = True    PS: 由于Config对象本质上是字典,所以还可以使用app.config.update(...) #不常用的几种方法 #1、通过py文件配置     app.config.from_pyfile("python文件名称")     如:     settings.py     DEBUG = True  2、app.config.from_pyfile("settings.py")     #通过环境变量配置     app.config.from_envvar("环境变量名称")     #app.config.from_pyfile(os.environ['YOURAPPLICATION_SETTINGS'])     环境变量的值为python文件名称名称,内部调用from_pyfile方法  3、app.config.from_json("json文件名称")     JSON文件名称,必须是json格式,因为内部会执行json.loads  4、app.config.from_mapping({'DEBUG': True})     字典格式   #settings.py文件默认路径要放在程序根目录,如果想更改 需要修改源码实例化过程中的最后两个参数, instance_relative_config=True, root_path=#setting文件的位置
View Code

#常用方式 app.config.from_object("python类或类的路径") app.config.from_object('pro_flask.settings.TestingConfig')  #settings.py class Config(object):     DEBUG = False     TESTING = False     DATABASE_URI = 'sqlite://:memory:'   class ProductionConfig(Config):     DATABASE_URI = 'mysql://user@localhost/foo'   class DevelopmentConfig(Config):     DEBUG = True   class TestingConfig(Config):     TESTING = True    #settings.py文件默认路径要放在程序根目录,如果想更改 需要修改源码实例化过程中的最后两个参数, instance_relative_config=True, root_path=#setting文件的位置

{         'DEBUG':                                get_debug_flag(default=False),  是否开启Debug模式         'TESTING':                              False,                          是否开启测试模式         'PROPAGATE_EXCEPTIONS':                 None,                                   'PRESERVE_CONTEXT_ON_EXCEPTION':        None,         'SECRET_KEY':                           None,         'PERMANENT_SESSION_LIFETIME':           timedelta(days=31),         'USE_X_SENDFILE':                       False,         'LOGGER_NAME':                          None,         'LOGGER_HANDLER_POLICY':               'always',         'SERVER_NAME':                          None,         'APPLICATION_ROOT':                     None,         '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,         'MAX_CONTENT_LENGTH':                   None,         'SEND_FILE_MAX_AGE_DEFAULT':            timedelta(hours=12),         'TRAP_BAD_REQUEST_ERRORS':              False,         'TRAP_HTTP_EXCEPTIONS':                 False,         'EXPLAIN_TEMPLATE_LOADING':             False,         'PREFERRED_URL_SCHEME':                 'http',         'JSON_AS_ASCII':                        True,         'JSON_SORT_KEYS':                       True,         'JSONIFY_PRETTYPRINT_REGULAR':          True,         'JSONIFY_MIMETYPE':                     'application/json',         'TEMPLATES_AUTO_RELOAD':                None,     }
默认配置

 

4、路由系统

典型写法

@app.route('/detail/<int:nid>',methods=['GET'],endpoint='detail') #<int:nid>转换器 #methods=['GET']该路由允许的请求方式 #endpoint='detail'   起别名,反向解析时用

默认转换器

DEFAULT_CONVERTERS = {     'default':          UnicodeConverter,     'string':           UnicodeConverter,      #常用     'any':              AnyConverter,     'path':             PathConverter,     'int':              IntegerConverter,      #常用     'float':            FloatConverter,     'uuid':             UUIDConverter, }

路由的本质

1. decorator = app.route('/',methods=['GET','POST'],endpoint='n1')     def route(self, rule, **options):         # app对象         # rule= /         # options = {methods=['GET','POST'],endpoint='n1'}         def decorator(f):             endpoint = options.pop('endpoint', None)             self.add_url_rule(rule, endpoint, f, **options)             return f         return decorator 2. @decorator     decorator(index) """ #同理 def login():     return '登录' app.add_url_rule('/login', 'n2', login, methods=['GET',"POST"]) #与django路由类似 #django与flask路由:flask路由基于装饰器,本质是基于:add_url_rule #add_url_rule 源码中,endpoint如果为空,endpoint = _endpoint_from_view_func(view_func),最终取view_func.__name__(函数名)
View Code

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!