草庐IT

【绝对清楚】Flask项目结构(有项目文件夹详细对照说明)

rchjr 2023-08-05 原文

插个目前实现的登录页面~😄

之前看了很多很多的Flask框架的项目结构,了解到它是一个高度灵活的轻量级web框架,意思就是项目的结构不像Django那样有着固定的模式,而是可以根据开发者的爱好进行设计。这也就给想用正儿八经的一种结构写一个网站带来了困扰。好在看了几天的资料后,我大概理清楚了思路,下面进行介绍。

废话不多说,先上我的项目结构(只有把自己的项目结构列出来并讲解清楚,才能至少让他人懂得一种结构),等会会进行详细的介绍。如上图所示,目前我的项目Personalwebsite一共有三个文件夹,分别是app、migrations、tests和两个py文件分别是config.py、manager.py。

这里还要提一下,就是很多人应该和我一样,知道Flask是相当于一个内核的,其本身功能并不多,主要是靠许多的插件来实现丰富的web功能。比如用于等于验证的flask_login,用于连接数据库的flask_alchemy,另外蓝图的开发模式,配置等等这些在开发中经常被提及的名词大家肯定也有所耳闻,那么以上这些到底是什么,我们要如何在项目结构中体现和使用它们呢?我这里不会介绍如何使用它,因为网上已经有很多大佬进行介绍了并且讲的特别清楚,唯一不足的就是没有结合整个项目结构来介绍,会给人一种很突兀的感觉,为什么要在项目中使用这些?它们具体放在项目中的哪些位置?这些是我困惑的地方,也是这篇文章主要要讲的内容。

一、app文件夹

我们知道开发一个网站一般分为三层(第四层就是数据库,存取数据用的),分别是前端的展示页面(这里有大家熟悉的html, css, js等文件)、后端的逻辑页面(用于获取数据库的数据并进行业务逻辑处理,最后把处理好的数据交给前端去渲染展示)和对象关系映射层ORM(这个大家可能没有听过,就是建立一个和数据库的有映射关系的对象,通过这个对象我们就可以直接操纵数据库,而不需要接触SQL语句,这就给开发人员减少了很多压力,也使得后端代码可以少一些SQL语句。)

而在app文件夹中就是存放所有这些层次的代码。App下面有static和templates文件夹是对应前端的代码;views文件夹则是对应后端代码(注意这里后端处理业务逻辑的也叫作视图函数);models.py则是存放ORM层的,在里面有许多的类,一个类就对应数据库中的一张表。

static和templates文件夹

如图这里我只做了登录的前端页面,分别由login.html和login.css。当然这里还有一个images文件夹存放前端的图片。

Views文件夹

这里的views中只有login.py,其实就是处理登录逻辑的一个视图函数。其他的都依次类推,比如要注册,可以设立一个注册的视图函数,也放在views文件夹中。

Models.py

App文件夹下的__init__.py

相信大家注意到了在app文件夹下还有一个__init__.py文件,那么这个文件是用来干啥的呢?在__init__.py中,我们需要构建一个flaskapp实例——app。并且在其中实现所有的配置,数据库,登录验证的实例化等等,说白了就是一个初始化的功能。在__init__.py中我们需要初始化一个加载了所有第三方扩展的app。但是不是用来运行app的,运行app的是后面的manager.py文件。

比如上面提到过的登录验证用的flask_login, 管理数据库的flask_alchemy等等,都需要在__init__.py中进行初始化。

如图,在__init__.py中,我们从config.py导入了配置类,并且导入了flask_login和flask_alchemy等等用于登录验证和连接数据库,同时我们还导入了Bluepring用于所谓的蓝图注册。

然后我们分别创建了对应的实例化对象如:main蓝图(这个蓝图只是一个实例,在views文件夹下的login.py其实也有蓝图,我还没写好,不然也会在__init__.py中导入),db作为ORM对象管理数据库,login_manager用于登录验证。之后我们构建一个create()函数用于构建app并且对蓝图进行注册,加载配置,创建ORM对象和绑定flask_login。

综上所述,在__init__.py我们的工作就是集成所有的功能,并把这些功能全部加载到最终的app应用中,并提供一个create()函数用于返回这个app。而manager.py就可以调用create()函数来得到具有完整功能的app了。

二、Config.py文件

我们知道flask设置配置文件的方法有很多,我这里采用的是写成一个类的形式。关于flask配置文件的内容可以看这篇博客:

https://blog.csdn.net/weixin_62588253/article/details/128576819

如上,我这里配置的信息还比较少,只配置了连接哪个数据库,后续可以在这里添加

三、Manager.py文件

这个文件就是对整个程序进行管理和运行的,但是我还没有写出来。(o(╥﹏╥)o)

四、Migrations文件夹

这个用于存放数据库迁移的一些文件,我也还没写,是看网上博客说有的。大家可以自行查阅

五、Tests文件夹

用于测试程序,我也还没写(o(╥﹏╥)o)。


总结:我认为最关键的就是前面我介绍的app文件夹还有config.py和manager.py,这些是构建项目必须的。其他的是项目做的差不多时需要用的,

有关【绝对清楚】Flask项目结构(有项目文件夹详细对照说明)的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  3. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  4. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  5. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  6. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  7. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  8. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  9. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  10. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

随机推荐