• 初涉FlaskWeb开发----基础篇


    1.web程序运行的基本流程

      {客户端发送请求 <-----> 服务器返回响应}

    2.使用框架可以降低开发难度,提高开发效率。

    3.Flask框架的基本认识:

      特点:用Python语言实现的轻量、简洁、扩展性强

       核心:werkzeug 和 Jinja2

    4.虚拟环境:

      创建虚拟环境:mkvirtualenv -p python3 名称

       进入虚拟环境:workon

       退出虚拟环境:deactivate

       移除虚拟环境:rmvirtualenv 名称

    5.依赖包:

      生成依赖包:pip freeze > requirements.txt

       安装依赖包:pip install -r requirements.txt

    6.基本程序:

      创建程序实例:__name__参数为字符串,表示模块名,可以确定程序所在位置,如果传入标准模块名,会影响静态路径的访问,不会影响视图函数的访问。

      定义装饰器路由:通过程序实例调用route函数实现,底层是通过add_url_rule()函数实现,第一个参数rule、第二个参数endpoint(视图函数名的字符串形式),第三个参数视图函数名。

      启动服务器:run方法可以启动服务器,可以指定调试debug,便于调试代码信息,自动跟踪代码的变化

     1 # 导入Flask
     2 from flask import Flask
     3 
     4 # 创建Flask类的对象
     5 # 结论:__name__参数的作用:确认程序实例文件所在的位置。
     6 # 1、必须要传入参数
     7 # 2、参数类型必须是字符串
     8 # 3、如果传入标准模块名,只会影响静态路径的访问,不会影响视图函数的访问。
     9 app = Flask(__name__)
    10 
    11 
    12 # 定义路由url地址
    13 # endpoint:表示视图函数名的字符串形式。
    14 # 不使用装饰器也可以实现路由映射。
    15 
    16 @app.route('/Lee',methods=['POST','GET'])
    17 def hello2018():
    18     # return 可以返回状态码,也可以返回不符合http协议的状态码,用来实现前后端的数据交互
    19     """
    20     前端发送ajax:
    21     $.ajax({
    22         url:'/Lee',
    23         data:。。。, 发送到后端的数据
    24         contentType:'', 发送到后端的数据类型
    25         dataType:'json' 后端返回的数据类型
    26         success:function(resp){
    27             if (resp == '888'){
    28                 alert(errmsg)
    29             }else{
    30 
    31             }
    32 
    33 
    34         }
    35     })
    36 
    37     errno=888,errmsg='用户名已注册'
    38 
    39 
    40     :return:
    41     """
    42     return 'hello world2018',888
    43 # self.add_url_rule(rule, endpoint, f, **options)
    44 # 通过程序实例调用添加url规则,也可以实现路由映射。
    45 # app.add_url_rule('/123','hello2018',hello2018)
    46 
    47 # 结论:
    48 # 1、视图函数不能重名。
    49 # 2、url可以重复,不同的http请求方法,是对应不同的操作get查询post插入put修改delete删除
    50 # @app.route('/')
    51 # def hello2019():
    52     # a = 1
    53     # b = 2
    54     # return a,b
    55     # 不能返回字典
    56     # my_dict = {'a':'123'}
    57     # return my_dict
    58     # 不能返回列表
    59     # my_list = [1,2,3]
    60     # return my_list
    61     # 可以返回元组
    62     # return 'hello world'
    63 
    64 
    65 # 启动服务器
    66 # __name__表示当前模块名,如果被导入文件的时候__name__表示文件名
    67 if __name__ == '__main__':
    68     # 查看路由映射:具体的url地址和视图函数名的指向关系。
    69     print(app.url_map)
    70     # debug调试模式:帮助定位错误信息,自动跟踪代码的变化
    71     app.run(debug=True)

    7.基本程序扩展:

      视图函数不能重名

      URL可以重复,因为不同的http请求方法代表不同的操作

      路径的访问顺序是从上到下依次查找,如果找到不会继续往下查找

    8.加载配置信息:

      加载配置对象

      加载配置文件ini格式文件

      加载环境变量

     1 from flask import Flask
     2 # 导入配置类
     3 # from config import Config
     4 from config import config_dict
     5 app = Flask(__name__)
     6 # 加载配置文件:三种实现形式
     7 # 1、加载配置对象,config是flask内置的配置对象
     8 # 重点掌握:因为扩展性更强
     9 # app.config.from_object(Config)
    10 # app.config.from_object(config_dict['pro'])
    11 # 2、加载配置文件
    12 # app.config.from_pyfile('config.ini')
    13 # 3、加载环境变量
    14 # app.config.from_envvar('SET')
    15 
    16 
    17 @app.route('/')
    18 def index():
    19     return 'hello world'
    20 
    21 if __name__ == '__main__':
    22     app.run()

    config.py文件:

    # 基本配置类
    class Config:
        DEBUG = None
    
    
    # 开发模式配置
    class DevelopmentConfig(Config):
        DEBUG = True
    
    
    # 生产模式配置
    class ProductionConfig(Config):
        DEBUG = False
    
    # 定义字典,实现配置类的映射
    config_dict = {
        'dev':DevelopmentConfig,
        'pro':ProductionConfig
    }

    9.状态码:

      return可以返回不符合http协议的状态码,用来前后端的数据交互。

    10.重定向:

      redirect----参数是具体的URL地址

      url_for ----参数是视图函数名(端点endpoint)

    # 导入flask内置的函数redirect
    from flask import Flask,redirect,url_for
    
    app = Flask(__name__)
    
    
    # 重定向redirect:接收参数为location,具体的url地址
    # 重新发送网络请求,跳转页面
    # 当项目路径(url)或文件发生变化的情况下,可以使用重定向。
    @app.route('/')
    def index():
        url = 'http://www.baidu.com'
        # 重定向到百度
        return redirect(url)
    
    # url_for反向解析:接收的参数endpoint,视图函数名
    @app.route('/for')
    def demo_url_for():
        return redirect(url_for('index'))
    
    
    if __name__ == '__main__':
        print(app.url_map)
        app.run(debug=True)

     11.Flask最基础框架:

     1 from flask import Flask
     2 
     3 app = Flask(__name__)
     4 
     5 
     6 @app.route("/")
     7 
     8 def index():
     9 
    10     return 'hello world'
    11 
    12 
    13 if __name__ == '__main__':
    14     
    15     app.run()

    12.请求上下文:

      request :请求对象,封装了客户端请求的参数信息;

      session :封装了客户信息,可以用来获取或设置用户信息;

    13.应用上下文:

      g对象 :临时请求过程中存储信息,请求结束后会被销毁;

       current_app : 在程序运行过程中,一直存在,保存程序的基本信息;

    14.请求勾子:

      before_first_request :在第一次请求前运行

      before_request:每次请求前运行

      after_request:在每次请求后运次,没有异常情况下,指定后端返回的数据格式

      teardown_request:即使没有异常的情况下,在每次请求后运行

    15.Flask扩展命令行:自定义ip和port,配合Migrate实现数据库的迁移

    16.模板:

      模板的本质是文件,作用是接收视图的返回结果,渲染响应数据

      变量:存储视图返回的结果 {{ 变量名 }}

      判断语句:控制输出

      {%  if  表达式  %}

      {%  endif  %}

      项目中使用的atrTemplate前端模板:

      {{ each  house  as  houseas}}

      数据:

      {{  each }}

    17.过滤器:本质是函数,作用计算或格式化输出数据  

      常规过滤器名:

      safe禁用模板转义

      capitalize首字符大写:title/lower/upper/formart/striptag/reverse

      列表处理:sum/sort/first/last

      过滤器的使用:可以链式使用,执行过程,从前到后,依次执行

    18.自定义过滤器:

      1.自定义函数,然后添加模板过滤器,app.add_template_filter(),第一个参数为函数名,第二个参数为自定义过滤器名称,如果过滤器名和内置过滤器重名,会重写内置过滤器;

      2.以装饰器的形式实现自定义过滤器,@app.template_filter(),只需要传入自定义的过滤器名;

    19.WTF扩展:实现模板页面的表单代码的复用,以及表单数据的验证

      1.自定义表单类,需要继承自FlaskForm;

      2.指定表单字段,加入验证函数;

      3.实例化表单对象,在模板页面中使用表单对象的字段

      [设置"SECRET_KEY",生成csrf_token加密口令,实现跨站请求保护,模板页面对应的表单域中需要设置form.csrf_token()

      验证器的调用:form.validate_on_submit()执行过程,会依据调用验证函数,其次验证页面中是否设置csrf_token,条件满足返回true,否则返回false]

      4.表单数据的获取,需要使用表单对象,form.字段名。data

        wtf对应的csrfprotect模块可以生成session信息,实现跨站请求保护

    20.继承、宏、包含:三者皆可实现代码复用

      1、继承:block,实现模板页面固定不变的区域,一般用来写菜单,底部栏等,模板不支持多继承,继承的实现需要加上区域块的名称;建议继承语句写在模板页面的顶部;

      2.宏:macro,实现模板页面动态(功能)代码块的封装,类似Python中的函数;

      3.include:实现原始静态页面的完整复用,wtf表单对象不能复用。

    21.Flask中的特殊变量和方法:

      config对象:保存配置信息,设置数据库放入连接、SECRET_KEY,config可以导入配置文件,读取配置文件;

      request常用的属性:args / form / data / method / files;

      url_for:反向解析,实现从视图函数找到具体的url,一般用来配合redirect实现页面的重定向;

      return redirect(url_for(视图函数名)):重定向建议使用url_for,简化页面重定向的操作;

      flask消息闪现,在视图中定义提示用户信息,在模板页面中使用循环展示提示信息for  x  in  get_flashed_messages()

    22.数据库:

      Flask_SQLAlchemy扩展包

      实力化sqlalchemy对象,需要和应用程序实例进行关联db = sqlalchemy(app)

      首先,需要手动创建数据库,其次,配置数据库的连接和动态追踪修改

      app.config['SQLALCHEMY_DATABASE_URI'] =   'mysql://root:mysql@localhost/database'
      app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

      在请求过程自动提交数据的设置,在未来版本中会被删除

    23.自定义模型类:

      1.继承自db.Model

      2.指定表的名称,建议项目名和表名,单个表名建议使用复数

      3.定义字段,db.Column()指定字段属性约束,主键、外键、唯一、默认值等;

      4.反向引用,us = db.relationship('USER',backre='role');

    24.实现一对多或多对一的查询:在数据库中没有具体的字段

      us可以实现多对一的查询

      role可以实现多对一的查询,在多的一方指定外键

      多对多的关系映射,本质就是两个一对多,数据的存储在第三张表

    25.db.session数据库会话对象,封装了对数据库的操作

      db.session.add()提交一条数据

      db.session.add_all()提交多条数据

      db.session.create_all()创建表

      db.session.drop_all()删除表

      db.session.rollback()回滚

    26. 基本查询:

      User.query.get()接收的参数为主键
      User.query.filter(User.id=user_id)过滤查询,需要指定模型类的类名,需要加上执行器,all()/first()/order_by()
      User.query.filter_by(id=user_id)过滤查询,需要传入字段名进行过滤,需要加上执行器
      and_/or_/in_/notin_与或非
      排序order_by/分页limit/paginate
      更新数据:User.query.filter_by(id=user_id).update({'name':'Lee'})
      

    27. 蓝图:

        1.类、模块化应用的容器;延迟创建路由映射
        2.创建蓝图对象:
      api = Blueprint('api',__name__)
         使用蓝图对象:
      @api.route()
        1、可以在创建蓝图对象的文件中使用
        2、可以导入其他文件中,但是需要把其他文件再次导入到当前创建蓝图对象的文件中,需要避免循环导入的问题,交错导入,
        3、注册蓝图路由,在创建应用程序实例的地方,app.register_blueprint(api.url_prefix='/api/v1.0') 

    28. 单元测试:
        测试的目的:为了检验功能代码预期结果和实际结果的差距
        使用unittest测试模块
        单元测试的书写:本质是断言代码,
      1、自定义测试类,需要继承自unittest.TestCase
      2、测试方法,setUp()方法名不能改变,一般用来定义测试代码执行前的准备工作,包括创建客户端,指定连接数据库,构造程序实例等
      3、测试方法,teatDow()方法名不能改变,一般用来定义测试代码执行后的清除工作,比如清除测试数据,清空缓存等;
      4、测试方法的函数名必须test开头;assert断言测试结果

    29. 部署:
        gunicorn -w 开启的进程数 -b 绑定的ip和port 启动文件名:程序实例名
        正向代理:面向客户端,服务器不知道访问的客户是谁
        反向代理:面向服务器:客户端不知道访问的服务器是谁

    30. REST ful API设计:
        域名、版本、路径、请求方法、返回结果、状态码、错误信息、过滤信息、数据交互格式、链接相关资源

    31. 性能:
        提高用户体验,减少响应时间
        性能优化:web前端优化、web后端优化、存储、运维优化
        后端优化:
      1、使用缓存,可以把大量访问,又不是经常修改的数据放入缓存中,比如项目首页信息
      2、使用异步:封装请求,实现对数据异步操作;
      3、多线程:线程数和硬件条件,以及对服务器的操作类型的不同而不同,IO密集型可以采取多线程的形式提高效率,计算型的任务不适合;
      4、存储优化;

     

      

      

       

  • 相关阅读:
    JavaScript面向对象之类的创建
    VSCode Debug模式下各图标 含义
    Visual Studio icon 含义
    Unity坐标系 左手坐标系 图
    Unity类继承关系 图
    Unity的SendMessage方法
    ONGUI->NGUI->UGUI (Unity UI史)
    Console.WriteLine 不会输出到unity控制台
    Chrome添加Unity本地文档引擎
    Unity "Build failed : Asset is marked as don't save " 解决方案
  • 原文地址:https://www.cnblogs.com/Lee1010/p/9898595.html
Copyright © 2020-2023  润新知