• flask 程序结构概括


    以此结构为例,这个小项目是《Flask Web开发:基于python的web应用开发实战》第一部分结束后的代码框架

    第一层

    有app、tests、migrations三个文件夹和config.py、manage.py两个py文件以及data-dev.sqlite、data-tests.sqlite两个sqlite数据库

      app文件夹下主要写flask程序;
      migrations 文件夹包含数据库迁移脚本;
      tests文件夹下编写单元测试;

      config.py用来存储配置

      manage.py 用于启动程序以及其他的程序任务

      data-dev.sqlite是程序运行时所用的数据库

      data-tests.sqlite是单元测试所使用的数据库

      app层

      下面有main、static、templates三个文件夹以及__init__.py、email.py、models.py三个py文件

      main文件夹用来保存蓝本,此文件夹下__inir__.py文件里面创建蓝本,(  蓝本和程序类似,也可以定义路由。不同的是,在蓝本中定义的路由处于休眠状态,直到蓝本注册到程序上后,路由才真正成为程序的一部分。)main文件夹下views.py用来保存程序的路由,errors.py用来处理错误,forms.py是存放表单定义

      static存放静态文件

      templates用来存放响应的html文件,mail子文件里面的用来保存发送邮件所需的.html和.txt文件

      __inir__.py文件里面包含create_app()函数,已经app的各种初始化

      email.py包含send_email()发送文件函数(异步)

      models.py包含User和Role两个表定义

      tests层

      test_basics.py用来编写单元测试

    应该还有一个venv文件夹用来包含虚拟环境和一个requirements.txt 文件,此文件列出了所有依赖包,便于在其他电脑中重新生成相同的虚拟环境

      

    个人需掌握  

    config.py中含有一个基类Config定义,三个继承类定义DevlopmentConfig、TestingConfig、ProductionConfig和一个元组config

      manage.py中含有app 创建,manage、migrate初始化,以及make_shell_context()函数在命令行获取上下文,避免频繁导入还有test()函数,用来测试。

      app下__init__.py文件含有create_app()函数,部分代码有

    bootstrap = Bootstrap()
    mail = Mail()
    moment = Moment()
    db = SQLAlchemy()
    
    
    def create_app(config_name):  #创建app
        app = Flask(__name__)
        app.config.from_object(config[config_name])  #将配置类中的配置导入程序
        config[config_name].init_app(app)
        bootstrap.init_app(app)
        mail.init_app(app)
        moment.init_app(app)
        db.init_app(app)
    
        from .main import main as main_blueprint  #导入蓝本main
        app.register_blueprint(main_blueprint)  #在主程序中注册蓝本
    
    
        return app

    app.config.from_object(config[config_name]) 将配置类中的配置导入程序!!

    在email中利用有这样一行代码

    app = current_app._get_current_object() 

     current_app程序上下文!!!,理解有些模糊

    在app/main/views下有一段代码比较重要

    @main.route('/',methods = ['POST','GET'])   #请求方式不管是post还是get都执行这个视图函数
    def index():
        form = NameForm()  #表单实例
        if form.validate_on_submit():   #提交按钮是否成功点击
             # 从数据库中查找和表单数据一样的数据,如果有,取第一个数据
            user = User.query.filter_by(username = form.name.data).first()
            if user is None:   #如果数据库中没有对应的数据
                user = User(username = form.name.data)  #在数据库中对应的表中创建数据
                db.session.add(user)  #加入到用户会话,以便数据库进行提交
                session['known'] = False  #这是一个新用户
                if current_app.config['FLASKY_ADMIN']:  #如果收件人已经定义,则调用发送邮件函数
                    send_email(current_app.config['FLASKY_ADMIN'],'New User','mail/new_user',user = user)
                    flash('The mail has been sent out')
            else:
                session['known'] = True  #这是一个老用户
            session['name'] = form.name.data   #从表单获取数据
            return redirect(url_for('.index'))
        return render_template('index.html',current_time = datetime.utcnow(),
                               form = form,name=session.get('name'),known

    以上全是个人理解,初次接触,学艺不精

    2016-08-29

     

  • 相关阅读:
    2 爬虫 requests模块
    http协议
    JAVA提高篇
    Java三大特性(封装、继承、多态)
    JavaScript对json对象数组排序(按照某个属性升降序排列)
    js中的闭包
    Java WebService 简单实例
    Quartz 入门详解
    web弹框/层 (layer )的使用
    Shiro
  • 原文地址:https://www.cnblogs.com/magicroc/p/5819781.html
Copyright © 2020-2023  润新知