一、Frappe框架和bench工作台
Bench 是用于管理 Frappe 应用程序和网站的命令行工具。
用Bench创建 frappe-bench 目录
让我们用Bench创建包含我们的应用程序和网站的项目文件夹。运行以下命令:
bench init frappe-bench
这将创建一个以当前工作目录命名的目录frappe-bench。它将执行以下操作:
- env在目录下创建一个python虚拟环境。
- 获取并安装frappe应用程序作为 Python 包。
- 安装的节点模块frappe。
- 构建静态资产。
- 总体目录结构
- env :Python虚拟环境,一台机器多套系统独立并存,如开发、测试、生产,或13开发版,13正式版
一套机器上允许装多套的erp系统,而且彼此独立。独立的原理是依据python的虚拟环境实现的,而且比如实际开发中要装多套系统,13、14,测试、开发等用来验证。
- config:Redis和Nginx配置文件
- logs:进程日志文件(web应用,工作进程)
程序运行过程中出错了,出错过程中的内部变量的信息变化
- sites:站点目录
一个站点对应一个数据库,比如一个公司需要不同的系统,但是apps是共用的- assets: 生产环境Nginx管理的静态资源(js,html,css,图片)文件
- assets: 生产环境Nginx管理的静态资源(js,html,css,图片)文件
- apps.txt:已安装应用清单
- commonsiteconfig.json: 通用站点配置文件
- apps.txt:已安装应用清单
- apps: 应用目录
可以这样理解,我们开发的一个app首先要安装到python,变成一个包,可以调用(import)的包。这些包还是需要安装到具体站点的,有可能说一个系统里面有个十个app,一个站点只用了五个,另外 一个站点用了十个,这样是可行的。每个站点用了那些app,是需要单独安装激活一下的。 - Procfile: 开发模式进程清单
二、apps和sites的概念
1、apps的概念
- Frappe App 的目录结构
- 一个典型的 Frappe App 目录结构如下所示
- 一个典型的 Frappe App 目录结构如下所示
- myapp:主应用的名称目录,包含应用的代码和资源。
- init.py:初始化文件,标志着这是一个 Python 包。
- config/:配置文件夹,包含应用的一些全局设置。
- modules.txt:列出应用中包含的模块(Module)。
- **public/**:用于存放静态资源(如 JavaScript、CSS、图片等)。
- templates/:存放 Jinja 模板文件,用于渲染页面。
- www/:用于定义 Web 路由和页面。
- patches.txt:记录数据库迁移的变更和升级路径。
- init.py:初始化文件,标志着这是一个 Python 包。
- hooks.py:Frappe 应用的钩子文件,用于注册各种事件(如表单提交、定时任务等)。
- requirements.txt:定义应用依赖的 Python 库。
- setup.py:应用的安装脚本,使用 Python 的 setuptools 进行打包和发布。
- MANIFEST.in:用于定义在打包时需要包含的文件列表。
- App、Module 与 DocType 的关系
- App 是最高层次的封装,包含多个模块(Module),每个模块负责某个特定的业务领域。
- Module 是 App 中的逻辑分组,每个模块下可能有多个 DocType(类似于数据库表的定义)。
- DocType 是模块中的核心数据结构,定义了系统中的业务实体和表单视图。
- App 是最高层次的封装,包含多个模块(Module),每个模块负责某个特定的业务领域。
- Frappe App 的创建
- 在 Frappe 中,创建一个新的应用程序非常简单。你可以通过命令行工具 bench 来创建应用:
- bench new-app myapp
- bench new-app myapp
- 这个命令会生成一个新的 Frappe 应用程序,包含标准的目录结构和文件。在创建完 App 后,你可以将它安装到某个 Frappe 站点中:
- bench --site sitename install-app myapp
- bench --site sitename install-app myapp
- 这时,你的应用就会成为这个站点的一部分,并且可以在其中运行和使用。
- 在 Frappe 中,创建一个新的应用程序非常简单。你可以通过命令行工具 bench 来创建应用:
2、sites的概念
bench new-site (你的站点名)
此命令将创建一个新的数据库,因此您需要输入 MySQL 根密码。它还会要求设置管理员用户的密码,只需设置一个您不会忘记的密码即可。这以后会很有用。现在,您将library.localhost在sites目录中拥有一个名为的新文件夹。
bench允许您创建多个站点,并通过同一端口在浏览器中分别访问它们。这就是我们在 bench 中所说的多租户支持。
三、DocType的创建、功能、类型
DocType 类似于其他框架中的 Model。除了定义属性之外,它还定义 Model 的行为。
解释:DocType 不仅仅像其他框架中的 Model 只是定义数据结构和属性(即数据库中的表和字段),它还通过配置和代码,定义了这个 Model 在系统中的行为和功能
理解:DocType对比传统的MVC,更像是M和C的结合(定义数据的属性和结构,加上数据的验证和处理逻辑,再者定义行为,如触发器和权限控制)
1、DocType的创建
- 1、启用开发者模式
- 在创建 DocType 之前,我们需要在工作台上启用开发者模式。这将在我们创建 doctype 时启用样板创建,并且我们可以使用我们的应用将它们跟踪到版本控制中
- 转到终端并退出工作台服务器(如果它已在运行)frappe-bench,然后从目录中运行以下命令:
bench set-config -g developer_mode true ; bench start
- 在创建 DocType 之前,我们需要在工作台上启用开发者模式。这将在我们创建 doctype 时启用样板创建,并且我们可以使用我们的应用将它们跟踪到版本控制中
- 2、创建DocType导航到DocType列表。此列表将包括与框架捆绑在一起的 DocType、已安装的 Frappe 应用程序的一部分以及您可以为每个站点创建的自定义 DocType。
- 1、我们创建一个Aricle的DocType列表,选择模块Library Management
- 2、在Fiedls里创建八个字段,并且设置他们的数据类型
- Article Name (Data, Mandatory)
- Image (Attach Image)
- Author (Data)
- Description (Text Editor)
- ISBN (Data)
- Status (Select) - Enter two options: Issued and Available (Type Issued, hit enter, then type Available)
- Publisher (Data)
- Article Name (Data, Mandatory)
- 2、在Fiedls里创建八个字段,并且设置他们的数据类型
2、DocType的功能
- DocType的命名
- Ⅰ、在我们创建了一个DocType,并且新增了一个记录后。我们在这个DocType 的List里会发现这条记录Name的值是一个哈希值
- Ⅱ、现在我们回到DocType里对Article这个DocType做一些设置,在Article页面的Setting里的Naming设置中,我们在Naming Rule里选择By fieldname(通过字段名),Auto Name字段里填入(field:article_name),现在我们创建一个新的Article时,Article的Article Name就不会被转为哈希值
- Ⅲ、我们可以在数据库中检查是否生效
select * from tabArticle;- 成功
- Ⅲ、我们可以在数据库中检查是否生效
3、DocType的类型
- 1. 关联的 DocTypes 是指在其他 DocTypes 中作为 Link 字段关联的 DocTypes。所有的 DocTypes 都可以进行关联。我们可以根据它们存储的数据类型,将 DocTypes 大致分为主数据和事务性数据。‘Article’(文章)、‘Library Member’(图书馆会员)是主数据的例子,因为它们表示的是一个实体(有形的或虚拟的)。‘Library Membership’(图书馆会员资格)是存储事务性数据的 Doctype 的例子。
- 2. 这时我们设置‘Library Membership’(图书馆会员资格)表单的Full Name字段时,通过Fetch From(找到表单),链接到‘Library Member’(图书馆会员)表单。然后选择‘Library Member’(图书馆会员)表单的Full Name(Data)字段
四、控制器
设置好后确保服务器端脚本已启用bench set-config -g server_script_enabled true,然后重新启动bench
Controller 是一个普通的 Python 类,它从frappe.model.Document基类扩展而来。此基类是 DocType 的核心逻辑。它处理如何从数据库加载值、如何解析值并将其保存回数据库。
五、表单脚本和网页浏览页面
表单脚本是客户端 JavaScript 代码,可增强表单的用户体验 (UX)
表单脚本可让您向表单添加客户端逻辑。您可以编写表单脚本来自动获取值、添加验证或向表单添加上下文操作。
还可以通过在系统中创建客户端脚本来编写表单脚本。如果逻辑特定于您的站点,则应该编写客户端脚本。如果您想跨站点共享表单脚本,则必须通过应用程序包含它们。
理解Frappe基础知识