Flask基础(一)

Flask

  • 项目结构

    projectName
    	| - app  										# 应用程序包
    		| - templates 								# jinjia2模板
    		|- static 									# css,js 图片等静态文件
    		| - main  									# py程序包 ,可以有多个这种包,每个对应不同的功能
    			| - __init__.py
    			|- errors.py
    			|- forms.py
    			|- views.py
    		|- __init__.py 								# 应用程序初始化的引用
    		|- email.py 								# 邮件处理程序
    		|- models.py 								# 数据库模型
    	|- migrations 									# 数据迁移文件夹
    	| - tests   									# 单元测试
    		|- __init__.py
    		|- test*.py 								# 单元测试程序,可以包含多个对应不同的功能点测试
    	|- venv  										# 虚拟环境
    	|- requirements.txt 							# 列出了所有依赖包以及版本号,方便在其他位置生成相同的虚拟环境以及依赖
    	|- config.py 									# 全局配置文件,配置全局变量
    	|- manage.py 									# 启动程序
    
  • 基本配置

    • 全局config配置
      import redis
      
      class Config:
          '''配置信息'''
          DEBUG = True
          SECRET_KEY = "skfhdkjcb1234KNNBJ*KLJ"			# 是被flask和扩展用于保证数据安全
          
      	 # 邮箱
          MAIL_SERVER = 'smtp.qq.com'
          MAIL_PORT = 465                                 # 如果启用ssl其值是465,如果不启用 请用25
          MAIL_USE_TLS = False
          MAIL_USE_SSL = True
          MAIL_USERNAME = 'xxxxxx'                        # 邮箱账号
          MAIL_PASSWORD = 'xxxxxxx'                       # stmp密码
          FLASKY_MAIL_SUBJECT_PREFIX = '[Flasky]'
          FLASKY_MAIL_SENDER = '[email protected]'               # 邮箱地址
          FLASKY_ADMIN = os.environ.get('FLASKY_ADMIN')
          
          # 数据库
          SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123456@host:port/database'
          SQLALCHEMY_TRACK_MODIFICATIONS = True   # 设置为True,Flask-SQLAlchemy将跟踪对象的修改并发出信号
      
          # redis
          REDIS_HOST = "redis host"
          REDIS_PORT = 6379
      
          # flask-session 配置
          SESSION_TYPE = "redis"
          SESSION_REDIS = redis.StrictRedis(host=REDIS_HOST, port=REDIS_PORT)
          SESSION_USE_SIGNER = True                      # 对cookie中的session_id 进行隐藏处理
          PERMANENT_SESSION_LIFETIME = 86400
      
      
      class DevelopmentConfig(Config):
          '''开发模式的配置信息'''
          pass
      
      
      class ProductionConfig(Config):
          '''生产环境配置'''
          DEBUG = False
      
      
      config_map = {
             
          "develop": DevelopmentConfig,
          "product": ProductionConfig
      }
      
    • app的__init__.py配置
      import redis
      from flask import Flask
      
      
      import config
      from exts import db, session, csrf, mail
      
      # 创建redis连接对象
      redis_store = None
      
      
      def create_app(config_name):
      
          app = Flask(__name__, template_folder='../templates', static_folder='../static')
      
          # 根据配置模式获取配置参数
          config_class = config.config_map.get(config_name)
          app.config.from_object(config_class)
      
          # 初始化数据库映射关联
          db.init(app)
      
          # 初始化redis
          global redis_store
          redis_store = redis.StrictRedis(host=config_class.REDIS_HOST, port=config_class.REDIS_PORT)
      
          # 初始化flask-session,将session保存到redis中
          session.init_app(app)
      
          # 补充csrf防护
          csrf.init_app(app)
      
          # 邮箱
          mail.init_app(app)
      
          return app
      
  • Flask基本知识

    • 路由
      • 使用route()装饰器用于注册给定的URL规则(字符串),实现视图功能。
      • 通过把URL的一部分变为 <变量> 其中的变量将作为关键字参数传递给函数。
      • 如果URL的尾部带有 /,则是唯一的URL,若果没有,则会重定向。
      • url_for() 反转函数用于构建制定函数的URL。避免了硬编码以及修改的不方便性。
        @app.route('/')			# 路由
         	def index():
         		return "Index"
        @app.route('/post/<int:post_id>')	# 变量和规则
        def show_post(post_id):					# 
            return 'Post %d' % post_id 
        @app.route('/login')
        def login():
            return url_for("index") 		# 反转url_for
        
    • 请求与响应
      • request

        • 是服务器对浏览器请求的封装,用来取出请求信息
        • Form 属性处理前端页面传输的表单数据。
        • args 解析查询字符串的内容,是指在URL的(?)之后的一部分URL
        • Cookies 保存会话内容的数据。
        • files 上传与文件有关的数据。
        • method 当前的请求方法。
          @app.route('/login', methods=['POST', 'GET'])
          def login():
              error = None
              if request.method == 'POST':
                  if valid_login(request.form['username'],  request.form['password']):        # form 的使用
                  	file = request.files['fiels']
                  	file.save('/var/www/uploads/' + secure_filename(file.filename))				# 如果想要把客户端的文件名作为服务器上的文件名并保证安全性可以采用secure_filename() 函数
                     username = request.cookies.get('username')											# 读取cookies
                     resp = make_response(render_template(...))											# 存储cookies
          		   resp.set_cookie('username', 'the username')
          		   return resp
              
          
      • Response

        • 是服务器对服务器响应的封装,用来添加要返回给浏览器的一个HTTP的响应信息。
        • HTTP响应包含状态行、消息爆头、空行和响应正文。
        • 使用 make_response() 函数构建响应信息
        • jsonify() 函数包装dumps()后有添加了一些曾庆功能,他将json输出转换为Response的对象,而且还将多个参数转换为数组,或将多个关键字参数转换为dict。
          # response.data:获取二进制的响应body数据
          # response.data = ‘xxx’ :设置响应body数据
          # response.calculate_content_length:获取响应的总字节数
          # response.header:获取响应对象的头部信息
          # response.status:获取字符串格式的响应状态码
          # response.status_code:获取int格式的响应状态码
          # response.freeze():将响应对象序列化,返回None
          # response.set_cookie():设置cookie(重点)
          # response.delete_cookie():删除cookie,将cookie设置为立即失效(重点)
          
          @app.route("/index")
          def index():
          	resp = make_response("index page 2")
              resp.status = "999 itcast"  # 设置状态码
              resp.headers["city"] = "cq " # 设置响应头
              resp.set_cookie("kl", "wjdh") # 设置cookies值
              return resp
              # jsonify
          @app.route('/_get_current_user')
          def get_current_user():
              return jsonify(username=g
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值