Flask框架基础学习一

Flask框架基础学习一

  • 官方文档:https://dormousehole.readthedocs.io/en/latest/

安装Flask

  • pip install flask

使用Flask和Flask的相关配置

  • 小试牛刀: 创建一个flask

    • from flask import Flask
      
      # 实例化Flask对象
      app = Flask(__name__)
      
      @app.route('/index')
      def index():
          return 'Hello Flask!!!'
      
      
      if __name__ == '__main__':
          app.run()  # 启动服务
      

flask实例化配置

  • import_name: Flask程序所在包,正常使用__name__就行,可以决定静态文件查找的路径。
  • static_path: 静态文件访问路径(不推荐使用, 一般使用static_url_path代替)
  • static_url_path: 静态文件访问路径,不传默认是: / + static_folder
  • static_folder: 静态文件存储的文件夹,不传默认是static
  • template_folder: 模板文件存储的文件夹,不传默认是templates

app = Flask(__name__)

flask默认配置项

class Config:
	'DEBUG': False,  # 启用/关闭调试模式
    'TESTING': False,  # 启用/关闭测试模式
    'PROPAGATE_EXCEPTIONS': None,  
    'PRESERVE_CONTEXT_ON_EXCEPTION': None,
    'SECRET_KEY': None,  # 秘钥
    'PERMANENT_SESSION_LIFETIME': datetime.timedelta(31),  # 控制session的有效时间
    'USE_X_SENDFILE': False,  # 启用/禁用 x-sendfile
    'LOGGER_NAME': '__main__',  # 日志记录器的名称
    'LOGGER_HANDLER_POLICY': 'always',
    'SERVER_NAME': None,
    'APPLICATION_ROOT': None,
    'SESSION_COOKIE_NAME': 'session',  # 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': datetime.timedelta(0, 43200),
    '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

注意: host和port只可以配置在run中

路由的使用

参数
  • 不传参的路由

    • @app.route('/index')
      def index():
          return 'ok'
      
  • 不限定类型的传参

    • @app.route('/user/<phone>')
      def user(phone):
          print(phone)
          return 'ok'
      
  • 限定类型的传参

    • """
      string		默认类型,不带斜杠的任何文本
      int			正整数
      float		正浮点数
      path		接收string同时也接受斜线
      uuid		接受UUID,类似于xxxx-xxxx-xxxx-xxxx
      """
      
      @app.route('/user/<int:phone>')  # 指定正整数
      def user(phone):
          print(phone)
          return 'ok'
      
  • 自定义类型的传参

    • from werkzeug.routing import BaseConverter  # 导入一个基本类
      
      
      # 定义
      class MyConverter(BaseConverter):
          
          def __init__(self, map, *args):
              super().__init__(map)
              self.regex = args[0]
      
      app.url_map.converters['phone_format'] = MyConverter
      
      
      # 使用
      @app.route('/user/<phone_format(r"1[3-9]\d{9}"):phone>')
      def user(phone):
          print(phone)
          return 'ok'
      
请求方式
from flask import Flask, request


@app.route(rule="/user", methods=["post","put","get","delete","patch"])
def user():
    print(request.url) 
    return request.method

http的请求与响应

请求request
  • 导入: from flask import request

  • 属性介绍

    • """
      data		请求体的数据						bytes
      form		请求中的html表单数据			 MultiDict
      args		请求中的查询字符串				MultiDict
      cookie		请求中cookie信息					  Dict
      headers		请求中的请求头					EnvironHeaders
      method		请求使用的HTTP方法				  GET/POST
      url			请求的URL地址					string
      files		请求上传的文件列表					*
      json		ajax请求的json数据				  json
      """
      
  • 访问的url: http://127.0.0.1:5000/user_request?aaa=1&credit=0&coupon=1&aaa=22

    • @app.route('/user_request', methods=['GET', 'POST'])
      def user_request():
          print(request.args)  # ImmutableMultiDict([('aaa', '1'), ('aaa', '22'), ('credit', '0'), ('coupon', '1')])
          print(request.args.get('aaa'))  # 1
          print(request.args.getlist('aaa'))  # ['1', '22']
          print(request.args.to_dict(flat=False))  # {'aaa': ['1', '22'], 'credit': ['0'], 'coupon': ['1']}
          print(request.args.to_dict(flat=True))  # {'aaa': '1', 'credit': '0', 'coupon': '1'}
          print(request.args.to_dict())  # {'aaa': '1', 'credit': '0', 'coupon': '1'}  默认是True
          return 'ok'
      
响应response
  • 导入: from flask import make_response

  • 响应html文件

    • @app.route('/index')
      def index():
          response = make_response('<h1>Hello</h1>')
          return response
      
      
      # 返回模板文件
      from flask import render_template
      
      
      @app.route('/data')
      def data():
          return render_template('index.html')  # ./templates/index.html
      
  • 响应JSON数据

    • from flask import jsonify  # 导入
      
      
      @app.route('/index')
      def index():
          data = [
              {'id': 1, 'name': 'aaa', 'age': 2},
              {'id': 2, 'name': 'bbb', 'age': 22},
              {'id': 3, 'name': 'ccc', 'age': 222},
              {'id': 4, 'name': 'ddd', 'age': 2222}
          ]
          return jsonify(data)
      
      
  • 重定向

    • 301永久重定向,302临时重定向

    • from flask import redirect
      
      
      @app.route('/red')
      def red():
          return redirect("http://www.baidu.com", 301)
          # return redirect("http://www.baidu.com")  # 不加默认是302
          
      
      # 使用url_for实现视图内部跳转
      from flask import url_for
      
      
      @app.route('/red')
      def red():
          return redirect(url_for('index'))  # url_for(视图方法名)
      
  • 自定义响应头和状态码

    • @app.route('/rep')
      def rep():
          response = make_response('ok')
          response.headers['Company'] = 'haha'  # 自定义响应头
          response.status_code = 400  # 自定义状态码
          return response
      
  • 返回图片到浏览器

    • @app.route('/img')
      def img():
          with open('./a.jpg', 'rb') as fp:
              img_data = fp.read()
              response = make_response(img_data)
              # response.headers['Content-Type'] = 'application/zip'  # 用户访问会自动下载文件为zip文件
              response.headers['Content-Type'] = 'image/jpeg'  # 将图片显示在浏览器中
              return response
      
          
      # 使用send_file
      from flask import send_file
      
      
      @app.route('/img_2')
      def img_2():
          return send_file('a.jpg')
      

cookie的使用

  • 设置cookie

    • @app.route('/set_cookie')
      def set_cookie_self():
          # 设置cookie
          response = make_response('ok')
          response.set_cookie('name', 'aaa', 100)  # 100代表cookie有效期,单位秒,不加代表永久有效
          response.set_cookie('age', '24')
          return response
      
  • 获取cookie

    • @app.route('/get_cookie')
      def get_cookie_self():
          # 获取cookie
          print(request.cookies)  # ImmutableMultiDict([('name', 'aaa'), ('age', '24')])
          print(request.cookies.get('name'))  # aaa
          print(request.cookies.get('age'))  # 24
          return 'ok'
      
  • 删除cookie

    • @app.route('/del_cookie')
      def del_cookie_self():
          # 删除cookie
          response = make_response('ok')
          response.set_cookie('name', '', 0)  # 设置有效期为0,可以达到删除的效果
          return response
      

session的使用

  • 设置session

    • class Config:
          SECRET_KEY = '123456AAAaaa'  # 秘钥
          ESSION_COOKIE_NAME = 'xxx'  # 设置session在浏览器中存储的key名
          
          # 设置session的有效期,默认是31天
      	# session.permanent = True
          # PERMANENT_SESSION_LIFETIME: datetime.timedelta(31)
          
          
      app.config.from_object(Config)
          
          
      @app.route('/set_session')
      def set_session_self():
          # 设置session
          session['name'] = 'aaa'
          session['info'] = {
              'age': 24,
              'sex': True
          }
          return 'ok'
      
  • 获取session

    • @app.route('/get_session')
      def get_session_self():
          # 获取session
          print(session)  # <SecureCookieSession {'info': {'age': 24, 'sex': True}, 'name': 'aaa'}>
          print(session.get('name'))  # aaa
          print(session.get('info'))  # {'age': 24, 'sex': True}
          return 'ok'
      
  • 删除session

    • @app.route('/del_session')
      def del_session():
          # 删除session
          try:
              # del session['name']  # 删除单个
              session.clear()  # 删除所有
          except Exception as e:
              print(e)
              pass
      
          return 'ok'
      
  • session的登录校验

    • from flask import Flask, render_template, request, session, url_for, redirect
      from functools import wraps
      
      app = Flask(__name__)
      
      
      class Config:
          DEBUG = True
          SECRET_KEY = '123456AAAaaa'
      
      
      app.config.from_object(Config)
      
      
      @app.route('/index')
      def index():
          return render_template('index.html')
      
      
      @app.route('/login', methods=['POST', 'GET'])
      def login():
          name = request.form.get('uname')
          pwd = request.form.get('pwd')
          radio = request.form.get('radio')
          if name == 'aaa' and pwd == '123':
              if radio:
                  session['uname'] = 'aaa'
                  session['pwd'] = '123'
              return '登录成功'
          else:
              return '登录失败'
      
      
      def my_session(func):
          @wraps(func)
          def inner(*args, **kwargs):
              if session.get('uname'):
                  # 如果存在uname,说明已经登录
                  ret = func()
                  return ret
              else:
                  # 没有uname,说明没登录,重定向到登录页面
                  return redirect(url_for('index'))
          return inner
      
      
      @app.route('/main1')
      @my_session  # 添加登录验证装饰器
      def main1():
          return 'main1'
      
      
      @app.route('/main2')
      @my_session
      def main2():
          return 'main2'
      
      
      if __name__ == '__main__':
          app.run()
      
      
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值