Odoo 15开发手册第九章 外部 API - 集成第三方系统

Odoo 服务端提供有外部 API,可供网页客户端和其它客户端应用使用。本章中我们将学习如何Odoo 的外部 API来实现将其Odoo服务端作为后端的外部应用。

可通过编写脚本来加载或修改Odoo数据,或是集成Odoo现有的业务应用,作为对Odoo应用一种补充。

我们将描述如何使用Odoo RPC调用,然后根据所学知识使用 Python为图书应用创建一个简单的命令行应用。

本章的主要内容有:

  • 介绍学习项目:图书目录的客户端应用
  • 在客户端机器上配置 Python
  • 探索Odoo的外部API
  • 实现客户端应用的XML-RPC接口
  • 实现客户端应用的用户界面
  • 使用OdooRPC库

学完本章后,读者可以创建一个简单的Python应用,使用Odoo作为后端进行查询和数据存储。

开发准备

本文基于​​第三章 Odoo 15开发之创建第一个 Odoo 应用​​创建的代码,具体代码请参见​​ GitHub 仓库​​。应将library_app模块放在addons路径下并进行安装。为保持前后一致,我们将使用​​第二章 Odoo 15开发之开发环境准备​​中的安装操作。本章完成后的代码请参见 ​​GitHub 仓库​​。

学习项目-图书目录客户端

本文中,我们将开发一个简单的客户端应用来管理图书目录。这是一个命令行接口(CLI) 应用,使用 Odoo 来作为后端。应用的功能很基础,核心放在用于与 Odoo服务端交互的技术。

这个简单CLI应用可以完成如下功能:

  • 通过标题搜索并列出图书
  • 向目录添加新书籍
  • 编辑图书标题

我们的主要目标是使用Odoo对外API,因此不希望引用其它读者可能不太熟悉的编程语言。有了这一出发点,最好的方式是就是使用Python来实现客户端应用。不过只要掌握了一种语言的XML-RPC库,相关处理RPC的技术同样适用于其它语言。

这个应用是一个 Python 脚本,等待输入命令来执行操作。示例如下:

$ python3 library.py add "Moby-Dick"
$ python3 library.py list "moby"
60 Moby-Dick
$ python3 library.py set 60 "Moby Dick"

这个示例会话演示了如何使用客户端应用添加、列出及修改图书标题。

该客户端应用通过Python运行,在开始编写客户端应用代码之前,应确保在客户端机器上安装有Python。

在客户端机器上安装 Python

Odoo API 可以在外部通过两种协议访问:XML-RPC和JSON-RPC。任何外部程序,只要是能实现其中一种协议的客户端,就可以与 Odoo 服务端进行交互。为避免引入其它编程语言,我们将保持使用 Python 来探讨外部 API。

到目前为止我们仅在服务端运行了 Python 代码。现在我们要在客户端上使用 Python,所以你可能需要在电脑上做一些额外设置。

要学习本文的示例,你需要能在操作电脑上运行 Python 3 代码。如果在前面已按前面章节配置过开发环境,应该已经就绪了,否则请安装Python。

可通过在命令行终端运行​​python3 --version​​命令来进行确认。如果没有安装,请参考官方网站找到所使用的平台的​​安装包​​。

Ubuntu中通常预安装了 Python 3,如果没有安装,可通过以下命令进行安装:

sudo apt-get install python3 python3-pip

如果你使用的是 Windows 10,可通过微软应用商店进行安装。

在PowerShell中运行python3会直接引导你去相应的下载页面(这算是龟叔去微软后增加的福利吗?)。

通过一键安装包安装了Odoo的Windows用户可能会奇怪为什么Python解释器没有准备就绪。这时需要进行额外的安装。简单地说是因为 Odoo一键安装包内置了Python解析器,在操作系统层面无法直接使用。

现在读者已经安装好了Python,就可以开始使用Odoo对外API了。

学习Odoo外部 API

在实现客户端应用前应当先熟悉下Odoo外部API。以下小节中使用Python解释器一探XML-RPC API。

使用XML-RPC连接 Odoo API

访问Odoo服务最简单的方法是使用XML-RPC,我们可以使用 Python 标准库中的​​xmlrpclib​​来实现。

不要忘记我们是要编写客户端程序连接服务端,因此需运行 Odoo 服务端实例来供连接。本例中我们假设 Odoo 服务端实例在同一台机器上运行,​​http://localhost:8069​​,但读者可以使用任意运行着服务的其它机器,只需能连接其IP地址或服务器名。

Odoo的 xmlrpc/2/common端点暴露了公共方法,无需登录即可访问。可用于查看服务端版本及检测登录信息。我们使用xmlrpc库来研究对外可访问的Odoo API common

首先打开 Python 3终端并输入如下代码:

>>> from xmlrpc import client
>>> srv = "http://localhost:8069"
>>> common = client.ServerProxy("%s/xmlrpc/2/common" % srv)
>>> common.version()
{'server_version': '15.0', 'server_version_info': [15, 0, 0, 'final', 0, ''], 'server_serie': '15.0', 'protocol_version': 1}

以上代码导入了xmlrpc库,然后创建了一个包含服务端地址和监听端口信息的变量。请根据自身状况进行修改(如 Alan 使用srv = 'http://192.168.0.12:8069')。

下一步访问服务端公共服务(无需登录),在/xmlrpc/2/common端点上暴露。其中一个可用方法是version(),用于查看服务端版本。我们使用它来确认可与服务端进行通讯。

另一个公共方法是authenticate()。该方法确认用户名和密码可被接受,返回的用户 ID可用于后续请求。示例如下:

>>> db, user, password = "odoo-dev", "admin", "admin"
>>> uid = common.authenticate(db, user, password, {})
>>> print(uid)
2

authenticate()方法接收4个参数:数据库名、用户名、密码以及user agent。些前的代码通过变量存储这些信息,然后将使用这些变量传参。

ODOO 14中发生的改变

Odoo 14支持API密钥,可使用它来获取Odoo API外部访问权限。API密钥可在用户的首选项(Preferences)表单中进行设置,位于账号安全(Account Security)标签下。

用户代理(User Agent)环境用于提供有关客户端的元信息。为必填项,至少应传一个空字典{}

若验证失败,返回值为False

common公共端点内容非常有限,要访问ORM API或是其它端点则需要先进行账号验证。

Odoo 15开发手册第九章 外部 API - 集成第三方系统_第1张图片

使用XML-RPC运行服务器端方法

要访问Odoo的模型及方法,需要使用xmlrpc/2/object。该端点要求先登录才能请求。

这个端点暴露了一个通用的execute_kw方法,接收模型名称、要调用的方法以及传递给方法的参数列表。

下面有一个演示execute_kw的示例。它调用了search_count方法,返回匹配域过滤器的记录数:

>>> api = client.ServerProxy('%s/xmlrpc/2/object' % srv)
>>> api.execute_kw(db, uid, password, 'res.users', 'search_count', [[]])
3

此处我们使用了xmlrpc/2/endpoint对象访问服务端 API。调用的方法名为execute_kw(),接收如下参数:

  • 连接的数据库名
  • 连接用户ID
  • 用户密码(或API密钥)
  • 目标模型名称
  • 调用的方法
  • 位置参数列表
  • 可选的关键字参数字典(本例中未使用)

可调用所有的模型方法,以下划线(_)开头的除外,这些是私有方法。有些的方法的返回值如果无法通过XML-RPC发送,则无法使用XML-RPC协议调用。browse()方法就属于这种情况,它返回的是一个记录集对象。使用XML-RPC调用browse()会返回TypeError: cannot marshal objects的报错。在进行XML-RPC调用时应将browse()换成read或是search_read,所返回的数据格式可通过XML-RPC协议发送给客户端。

下面我们就来看看如何通过searchread查询Odoo数据。

使用API方法search和read

Odoo的服务端使用browse来查询记录。在RPC客户端中无法使用它,因为记录集对象无法通过RPC协议进行传输。这时应当使用read方法。

read([, [])browse方法类似,但它返回的不是记录集,而是记录列表。每条记录都是包含请求字段及数据的字典。

下面来看如何通过read()从Odoo获取数据:

>>> api = client.ServerProxy("%s/xmlrpc/2/object" % srv)
>>> api.execute_kw(db, uid, password, "res.users", "read", [2, ["login", "name", "company_id"]])
[{'id': 2, 'login': 'admin', 'name': 'Mitchell Admin', 'company_id': [1, 'YourCompany']}]

上例对res.users模型调用了read方法,传入了两个位置参数:记录ID 2 (也可以使用ID列表)以及获取字段的列表["login", "name", "company_id"],没传递关键字参数。

得到结果是一个字典列表,其中每个字典对应一条记录。对多字段的值有一种具体的表现形式。由记录ID和记录显示名组成的一对。例如,上例中返回的company_id的值为[1, 'YourCompany']

可能会不知道记录ID,这时需要使用search调用来查找到匹配域过滤器的那些记录ID。

例如,想要查找管理员用户时,可使用[("login", "=", "admin")]。这一RPC调用如下:

>>> domain = [("login", "=", "admin")]
>>> api.execute_kw(db, uid, password, "res.users", "search", [domain])
[2]

其结果是仅有一个元素(2)的列表,元素为admin用户的ID。

经常会使用search结合read方法查找符合域过滤器条件的ID,然后再获取它们的数据。在客户端应用中,这会反复调用服务端。可通过search_read方法进行简化,它可以一步就执行以上两个操作。

下例为使用search_read来查找admin用户并返回其名称:

>>> api.execute_kw(db, uid, password, "res.users", "search_read", [domain, ["login", "name"]])
[{'id': 2, 'login': 'admin', 'name': 'Mitchell Admin'}]

这个search_read方法使用了两个位置参数:包含域过滤器的列表,以及另一个包含需获取字段的列表。

search_read的参数如下:

  • domain:域过滤器表达式列表
  • fields:待获取字段名称列表
  • offset:跳过的记录数或用于分页
  • limit:返回的最大记录数
  • order:用于ORDER BY语句的字符串

readsearch_readfields均为可选参数。如未提供,会获取所有的模型字段。但这可能会使用到大开销的字段计算并且会返回大量无需使用的数据。因此建议显式地提供字段列表。

execute_kw调用既可使用位置参数也可使用关键字参数。以下是把位置参数换成关键字参数的示例:

>>> api.execute_kw(db, uid, password, "res.users", "search_read", [], {"domain": domain, "fields": ["login", "name"]})
[{'id': 2, 'login': 'admin', 'name': 'Mitchell Admin'}]

获取数据时最常使用的就是search_read,但还存在其它方法用于写入数据或触发其它业务逻辑。

调用其它API方法

所有的其它模型方法也通过RPC对外暴露,那以下划线开头的私有方法除外。也就是说可以调用createwriteunlink来修改服务端的数据。

我们来看一个例子。以下代码新建一条partner记录,然后修改记录,再读取记录确定是否写入了修改,最后进行了删除:

>>> x = api.execute_kw(db, uid, password, "res.partner",
... "create",
... [{'name': 'Packt Pub'}])
>>> print(x)
63
>>> api.execute_kw(db, uid, password, "res.partner",
... "write",
... [[x], {'name': 'Packt Publishing'}])
True
>>> api.execute_kw(db, uid, password, "res.partner",
... "read",
... [[x], ["name"]])
[{'id': 63, 'name': 'Packt Publishing'}]
>>> api.execute_kw(db, uid, password, "res.partner",
... "unlink",
... [[x]])
True
>>> api.execute_kw(db, uid, password, "res.partner",
... "read",
... [[x]])
[]

XML-RPC的一个限制是它不支持None值。有一个XML-RPC插件可支持None值,但这取决于客户端使用的XML-RPC库。没有返回值的方法可能无法使用XML-RPC,因为这些方法隐式地返回None。这也是为什么方法的最佳实践要求有返回值,至少应返回True。另一个选择是使用JSON-RPC。OdooRPC库支持该协议,本文的使用OdooRPC库一节中会用到它。

模型中以下划线开头的方法被看作私有方法,无法通过XML-RPC对外暴露。

小贴士:通常客户端应用希望复制用户在Odoo表单中输入的内容。调用create()方法可能还不够,因为表单可能会使用onchange方法自动化操作一些字段,这通过表单交互触发,没经过create()。解决方案是在Odoo中创建一个自定义方法,其中使用create()方法并运行onchange方法中的操作。

有必须反复说明一下,Odoo的对外API大部分编程语言都可以使用。​​官方文档​​中包含有Ruby、PHP和Java使用示例。

至此,我们已学习到如何使用XML-RPC协议调用Odoo方法。接下来我们使用它来构建图书目录客户端应用。

实现图书客户端XML-RPC 接口

下面就来实现图书目录客户端应用。

可分为两个文件:一个是包含服务端后台的Odoo后台接口,library_xmlrpc.py,另一个用于用户界面,library.py。这让我们可以对后台接口使用替代的实现。

先从Odoo后台组件开始,LibraryAPI类用于配置与Odoo服务端之间连接,以支持与Odoo交互所需的方法。所要实现的方法有:

  • search_read()</strong> 通过标题查找图书数据</li> <li><strong>create(<title>)</strong> 使用指定标题创建图书</li> <li><strong>write(<id>, <title>)</strong> 使用图书ID更新书名</li> <li><strong>unlink(<id>)</strong> 使用ID删除图书</li> </ul> <p>在电脑上选择一个目录存放应用文件,并创建<strong>library_xmlrpc.py</strong>文件。先添加类的构造方法,如下:</p> <pre><code>import xmlrpc.client class LibraryAPI: def __init__(self, host, port, db, user, pwd): common = xmlrpc.client.ServerProxy( "http://%s:%d/xmlrpc/2/common" % (host, port)) self.api = xmlrpc.client.ServerProxy( "http://%s:%d/xmlrpc/2/object" % (host, port)) self.uid = common.authenticate(db, user, pwd, {}) self.pwd = pwd self.db = db self.model = "library.book"</code></pre> <p>类中存储了执行对目标模块调用所需的所有信息:API XML-RPC引用、<strong>uid</strong>、密码、数据库名以及模型名。</p> <p>对Odoo的RPC调用会使用相同的<strong>execute_kw</strong> RPC方法。下面对其添加一层封装,放在<strong>_execute()</strong> 私有方法中。它利用对象存储的数据提供更小的函数签名,如以下代码所示:</p> <pre><code>def _execute(self, method, arg_list, kwarg_dict=None): return self.api.execute_kw( self.db, self.uid, self.pwd, self.model, method, arg_list, kwarg_dict or {})</code></pre> <p><strong>_execute()</strong>私有方法用于让更高阶的方法实现更简洁。</p> <p>第一个公有方法是<strong>search_read()</strong>。它接收 一个可选字符串用于搜索书名。如未提供标题,则会返回所有记录。相应的实现如下:</p> <pre><code>def search_read(self, title=None): domain = [("name", "ilike", title)] if title else [] fields = ["id", "name"] return self._execute("search_read", [domain, fields])</code></pre> <p><strong>create()</strong>方法用于按给定书名创建新书并返回所创建记录的 ID:</p> <pre><code>def create(self, title): vals = {"name": title} return self._execute("create", [vals])</code></pre> <p><strong>write()</strong>方法中传入新书名和图书 ID 作为参数,对该书执行写操作:</p> <pre><code>def write(self, id, title): vals = {"name": title} return self._execute("write", [[id], vals])</code></pre> <p>最后<strong>unlink()</strong>方法用于删除给定ID的图书:</p> <pre><code>def unlink(self, id): return self._execute("unlink", [[id]])</code></pre> <p>在该Python文件最后添加一段测试代码在运行时执行:</p> <pre><code>if __name__ == "__main__": # 测试配置 host, port, db = "localhost", 8069, "odoo-dev" user, pwd = "admin", "admin" api = LibraryAPI(host, port, db, user, pwd) from pprint import pprint pprint(api.search_read())</code></pre> <p>如果执行以上 Python 脚本,我们可以打印出图书的内容:</p> <pre><code>$ python3 library_xmlrpc.py [{'id': 3, 'name': 'Brave New World'}, {'id': 2, 'name': 'Odoo 11 Development Cookbook'}, {'id': 1, 'name': 'Odoo Development Essentials 11'}]</code></pre> <p>现在已经有了对 Odoo 后台的简单封装,下面就可以处理命令行用户接口了。</p> <h3>实现客户端用户接口</h3> <p>我的目标是学习如何写外部应用和 Odoo 服务之间的接口,前面已经实现了。但不能止步于此,我们再为这个最小化客户端应用构建一个用户接口。</p> <p>为保持尽量简单,我们使用简单的命令行用户接口并避免使用其它依赖。那我们可以使用Python 内置功能和<strong>ArgumentParser</strong>库来实现这个命令行应用。代码如下:</p> <pre><code>from argparse import ArgumentParser from library_xmlrpc import LibraryAPI</code></pre> <p>下面我们来看看参数解析器接收的命令,有以下四条命令:</p> <ul> <li><strong>list </strong>搜索并列出图书</li> <li><strong>add </strong>添加图书</li> <li><strong>set </strong>修改书名</li> <li><strong>del </strong>删除图书</li> </ul> <p>实现以上命令的命令行解析代码如下:</p> <pre><code>parser = ArgumentParser() parser.add_argument( "command", choices=["list", "add", "set", "del"]) parser.add_argument("params", nargs="*") # 可选参数 args = parser.parse_args()</code></pre> <p>这里的args对象表示用户传入的参数。<strong>args.command</strong>是所用到的命令,在给定<strong>args.params</strong>时,其存储的是命令所使用的其它参数。</p> <p>如果未传参数或参数错误,参数解析器会进行处理,提示用户应该输入的内容。有关argparse更完整的说明,请参考​​官方文档​​。</p> <p>下一步是执行操作响应用户输入的命令。我们先创建一个<strong>LibraryAPI</strong>实例。这需要提供详细的Odoo连接信息,在我们的简单实现中采用了硬编码,代码如下:</p> <pre><code>host, port, db = "localhost", 8069, "odoo-dev" user, pwd = "admin", "admin" api = LibraryAPI(host, port, db, user, pwd)</code></pre> <p>第一行代码设置服务实例的一些固定参数以及要连接的数据库。本例中,我们连接本地 Odoo 服务(localhost),监听<strong>8069</strong>默认端口,并使用 <strong>odoo-dev</strong>数据库。如需连接其它服务器和数据库,请对参数进行相应调整。</p> <p>还需要添加代码处理每条命令。我们先从返回图书列表的<strong>list</strong>命令开始:</p> <pre><code>if args.command == "list": title = args.params[:1] if len(title) != 0: title = title[0] books = api.search_read(title) for book in books: print("%(id)d %(name)s" % book)</code></pre> <p>这里我们使用了<strong>LibraryAPI.search_read()</strong>来从服务端获取图书记录列表。然后遍历列表中每个元素并打印。</p> <p>下面添加add命令:</p> <pre><code>if args.command == "add": title = args.params[0] book_id = api.create(title) print("Book added with ID %d for title %s." % (book_id, title))</code></pre> <p>因为主要的工作已经在<strong>LibraryAPI</strong>对象中完成,我们只要调用<strong>create() </strong>方法并向终端用户显示结果即可。</p> <p><strong>set</strong>命令允许我们修改已有图书的书名,应传入两个参数,新书名和图书的 ID:</p> <pre><code>if args.command == "set": if len(args.params) != 2: print("set command requires a Title and ID.") else: book_id, title = int(args.params[0]), args.params[1] api.write(book_id, title) print("Title of Book ID %d set to %s." % (book_id, title))</code></pre> <p>最终我们要实现 <strong>del</strong> 命令来删除图书记录。实现方式和之前并没有什么差别:</p> <pre><code>if args.command == "del": book_id = int(args.params[0]) api.unlink(book_id) print("Book with ID %s was deleted." % book_id)</code></pre> <p>客户端应用至此已完成,可以尝试使用一些命令。应该可以执行本文开头的那些命令。</p> <blockquote> <p>小贴士:在Linux系统中,可通过执行<strong>chmod +x library.py</strong>命令并在文件的首行添加<strong>#!/usr/bin/env python3</strong>来让<strong>library.py</strong>文件变为可执行。之后就可以在命令行中运行了<strong>./library.py</strong>。</p> </blockquote> <p>这是一个非常基础的应用,还有很多改进的方式。我们的目的是使用Odoo RPC API构建一个最小可用应用。</p> <p></p> <p class="img-center"><a href="http://img.e-com-net.com/image/info8/1ce1e9d341f3498ba8ca65ebece496ed.jpg" target="_blank"><img alt="Odoo 15开发手册第九章 外部 API - 集成第三方系统_第2张图片" height="193" src="http://img.e-com-net.com/image/info8/1ce1e9d341f3498ba8ca65ebece496ed.jpg" width="650" style="border:1px solid black;"></a></p> <h3>使用OdooRPC库</h3> <p>另一个可以考虑的客户端库是<strong>OdooRPC</strong>。它是一个完整的客户端库,把XML-RPC协议换成了JSON-RPC 协议。事实上 Odoo 官方客户端使用的就是JSON-RPC,XML-RPC更多是用于支持向后兼容性。</p> <blockquote> <p>ℹ️OdooRPC库现在由 OCA 管理和持续维护。了解更多请参见​​OCA​​。</p> </blockquote> <p><strong>OdooRPC</strong>库可通过PyPI安装:</p> <pre><code>pip3 install odoorpc</code></pre> <p><strong>OdooRPC</strong>在新建<strong>odoorpc.ODOO</strong>对象时配置了服务端连接。此时我们应使用<strong>ODOO.login()</strong>方法创建一个用户会话。和服务端一样,会员有一个包含会话环境的<strong>env</strong>属性,包括用户ID、<strong>uid</strong>和上下文。</p> <p><strong>OdooRPC</strong>库可用于对服务端的<strong>library_xmlrpc.py</strong>接口提供一个替代实现。功能相同,只是把XML-RPC换成了JSON-RPC。</p> <p>创建<strong>library_odoorpc.py</strong> Python模块来对<strong>library_xmlrpc.py</strong>模块进行修改。新建的<strong>library_odoorpc.py</strong>文件中加入如下代码:</p> <pre><code>import odoorpc class LibraryAPI(): def __init__(self, host, port, db, user, pwd): self.api = odoorpc.ODOO(host, port=port) self.api.login(db, user, pwd) self.uid = self.api.env.uid self.model = "library.book" self.Model = self.api.env[self.model] def _execute(self, method, arg_list, kwarg_dict=None): return self.api.execute( self.model, method, *arg_list, **kwarg_dict)</code></pre> <p><strong>OdooRPC</strong>库实现<strong>Model</strong>和<strong>Recordset</strong>对象来模拟服务端对应的功能。目标是在客户端编程与服务端编程应基本一致。客户端使用的方法利用这点并在<strong>self.Mode</strong>l属性中存储对<strong>library.book</strong>模型引用,通过OdooRPC的<strong>env["library.book"]</strong>调用提供。</p> <p>这里同样实现了<strong>_execute()</strong>方法,可与XML-RPC版本进行对比。OdooRPC库中的<strong>execute()</strong>方法可运行指定的Odoo模型方法。</p> <p>下面我们来实现<strong>search_read(</strong>), <strong>create()</strong>, <strong>write()</strong>和<strong>unlink()</strong>这些客户端方法。在相同文件的<strong>LibraryAPI()</strong>类中添加如下方法:</p> <pre><code>def search_read(self, title=None): domain = [("name", "ilike", title)] if title else [] fields = ["id", "name"] return self.Model.search_read(domain, fields) def create(self, title): vals = {"name": title} return self.Model.create(vals) def write(self, id, title): vals = {"name": title} self.Model.write(id, vals) def unlink(self, id): return self.Model.unlink(id)</code></pre> <p>注意这段代码和 Odoo 服务端代码极其相似。</p> <p>可使用<strong>LibraryAPI</strong>对象替换<strong>library_xmlrpc.py</strong>。可通过编辑<strong>library.py</strong>文件将<strong>from library_xmlrpc import LibraryAPI</strong>一行替换为<strong>from library_odoorpc import LibraryAPI</strong>将其用作RPC连接层。然后对<strong>library.py</strong>客户端应用进行测试,执行效果应该是和之前一样的。</p> <h3>了解ERPpeek客户端</h3> <p>ERPpeek是一个多功能工具,既可以作为交互式命令行接口(CLI)也可以作为 Python库,它提供了比xmlrpc库更便捷的 API。它在PyPi索引中,可通过如下命令安装:</p> <pre><code>pip3 install erppeek</code></pre> <p>ERPpeek不仅可用作 Python 库,它还可作为 CLI 来在服务器上执行管理操作。Odoo shell 命令在主机上提供了一个本地交互式会话功能,而erppeek库则为网络上的客户端提供了一个远程交互式会话。打开命令行,通过以下命令可查看能够使用的选项:</p> <pre><code>erppeek --help</code></pre> <p>下面一起来看看一个示例会话:</p> <pre><code>$ erppeek --server='http://127.0.0.1:8069' -d odoo-dev -uadmin Usage (some commands): models(name) # List models matching pattern model(name) # Return a Model instance ... Password for 'admin': Logged in as 'admin' odoo-dev >>> model('res.users').count() 3 odoo-dev >>> rec = model('res.partner').browse(14) odoo-dev >>> rec.name 'Azure Interior'</code></pre> <p>如上所见,建立了服务端的连接,执行上下文引用了model() 方法来获得模型实例并对其进行操作。连接使用的erppeek.Client实例也可通过客户端变量来使用。 值得一提的是它可替代网页客户端来管理所安装的插件模块:</p> <ul> <li>client.modules()列出可用或已安装模块</li> <li>client.install()执行模块安装</li> <li>client.upgrade()执行模块升级</li> <li>client.uninstall()卸载模块</li> </ul> <p>因此ERPpeek可作为 Odoo 服务端远程管理的很好的服务。有关ERPpeek的更多细节请见 ​​GitHub​​。</p> <p></p> <p class="img-center"><a href="http://img.e-com-net.com/image/info8/31f2f86eae824667ba4c229c71acf1d1.jpg" target="_blank"><img alt="Odoo 15开发手册第九章 外部 API - 集成第三方系统_第3张图片" height="511" src="http://img.e-com-net.com/image/info8/31f2f86eae824667ba4c229c71acf1d1.jpg" width="650" style="border:1px solid black;"></a></p> <h3>小结</h3> <p>本文的目标是学习外部 API 如何运作以及它们能做些什么。一开始我们通过一个简单的Python XML-RPC客户端来进行探讨,但外部 API 也可用于其它编程语言。事实上官方文档中包含了Java, PHP和Ruby的代码示例。</p> <p>然后我们学习了如何使用XML-RPC调用搜索、读取数据,以及如何调用其它方法。比如我们可以创建、更新和删除记录。</p> <p>接着我们介绍了OdooRPC库。它在RPC基础库(XML-RPC 或 JSON-RPC) 上提供了一层,用于提供类似服务端API的本地API。这降低了学习曲线,减少了编程失误并且让在服务端和客户端之间拷贝代码变得更容易。</p> <p>以上我们就完结了本文有关编程 API 和业务逻辑的学习。是时候深入视图和用户界面了。在下一篇文章中,我们进一步学习后台视图以及web客户端提供的开箱即用的用户体验。</p> <h3>扩展阅读</h3> <p>以下参考资料可用于补充本文所学习的内容:</p> <ul> <li>Odoo web服务的​​官方文档​​中包含了Python以外编程语言的代码示例。</li> <li>​​OdooRPC文档​​</li> <li>​​ERPpeek文档​​</li> </ul> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1726877308775641088"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(Odoo开发手册&指南,开发语言,python)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1891602009056931840.htm" title="Python:基于Scapy的深度包分析与网络攻击防御方案" target="_blank">Python:基于Scapy的深度包分析与网络攻击防御方案</a> <span class="text-muted">Lethehong</span> <a class="tag" taget="_blank" href="/search/Python%E5%9C%A8%E6%89%8B/1.htm">Python在手</a><a class="tag" taget="_blank" href="/search/bug%E6%BA%9C%E8%B5%B0%EF%BC%81%E7%A0%81%E5%86%9C%E7%9A%84%E5%BF%AB%E4%B9%90/1.htm">bug溜走!码农的快乐</a><a class="tag" taget="_blank" href="/search/%E4%BD%A0%E4%B8%8D%E6%87%82%EF%BD%9E/1.htm">你不懂~</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/scapy/1.htm">scapy</a><a class="tag" taget="_blank" href="/search/syn/1.htm">syn</a><a class="tag" taget="_blank" href="/search/dns/1.htm">dns</a> <div>嗨,我是Lethehong!立志在坚不欲说,成功在久不在速欢迎关注:点赞⬆️留言收藏欢迎使用:小智初学计算机网页AI感谢这位博主提出的问题,如果在以后的文章中,大家有其他相关的问题,也可以积极的在评论区评论出来,博主我会的,我会积极的收纳问题,并及时的做出回应!目录1.环境准备2.基础流量捕获3.深度协议解析4.异常流量检测逻辑4.1SYNFlood检测4.2DNS放大攻击检测5.高级分析技术5.</div> </li> <li><a href="/article/1891598733334867968.htm" title="Python之json模块的序列化和反序列化" target="_blank">Python之json模块的序列化和反序列化</a> <span class="text-muted">如梦@_@</span> <a class="tag" taget="_blank" href="/search/python%E5%9F%BA%E7%A1%80/1.htm">python基础</a> <div>序列化:可以理解为压缩反序列化:可以理解为解压Python中序列化和反序列化其实就是一个正反两个过程。序列化就是将Python对象转化为json格式,因为Python对象只有Python语言能够识别,如果想把数据发给Java代码写的程序,那么就识别不了,所以就有一个中间的格式:json,Java中也是一样,就是将Java的数据类型转换成json格式。反序列化就是,Python接收数据的应该是Pyt</div> </li> <li><a href="/article/1891598102620598272.htm" title="深入解析HTTP与HTTPS:定义、架构、原理、应用场景及实战指南" target="_blank">深入解析HTTP与HTTPS:定义、架构、原理、应用场景及实战指南</a> <span class="text-muted">CloudJourney</span> <a class="tag" taget="_blank" href="/search/http/1.htm">http</a><a class="tag" taget="_blank" href="/search/https/1.htm">https</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a> <div>前言在互联网技术飞速发展的今天,HTTP(HypertextTransferProtocol)和HTTPS(HypertextTransferProtocolSecure)已经成为Web通信的基础协议。无论是浏览网页、提交表单,还是进行数据交互,HTTP和HTTPS都扮演着至关重要的角色。本篇博文将深入解析HTTP和HTTPS的定义、架构、原理、应用场景、常见命令体系及实战场景,帮助读者全面了解并</div> </li> <li><a href="/article/1891597976120389632.htm" title="python3安装mysql连接_Python3使用PyMySQL连接MySQL" target="_blank">python3安装mysql连接_Python3使用PyMySQL连接MySQL</a> <span class="text-muted">weixin_39814925</span> <div>前提介绍:【功能实现】:1.登录本地MySQLServer创建数据库和表,Python3使用PyMySQL连接本地MySQL服务器,实现对数据库的表进行简单Insert操作。【软件配置】:1.MySQL服务器:MySQL8.0.202.Pymsql版本:Pymsql0.9.33.Python版本:Python34.NavicatforMySQL版本:Navicat115.PyCharm版本:PyC</div> </li> <li><a href="/article/1891597472241872896.htm" title="阅读Android源码的一些姿势" target="_blank">阅读Android源码的一些姿势</a> <span class="text-muted">weixin_34405332</span> <div>2019独角兽企业重金招聘Python工程师标准>>>前面吐槽了有没有必要阅读Android源码,后面觉得只吐槽不太好,还是应该多少弄点干货。需要说明的是,Android每个系统版本的源码都会有变动,而且代码中时不时Java和Native互相穿插,追求完全看透源码意义不大,把目的定在“理解代码设计的思路,弄清各个生命周期方法调用的顺序”比较实际。日常开发中怎么阅读源码找到正确的源码IDE是日常经常</div> </li> <li><a href="/article/1891597346001711104.htm" title="Android零基础入门第64节:揭开RecyclerView庐山真面目" target="_blank">Android零基础入门第64节:揭开RecyclerView庐山真面目</a> <span class="text-muted">weixin_33749242</span> <a class="tag" taget="_blank" href="/search/%E7%A7%BB%E5%8A%A8%E5%BC%80%E5%8F%91/1.htm">移动开发</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>2019独角兽企业重金招聘Python工程师标准>>>大家还记得之前在第38期~第50期都在学习列表控件吗,其中用了8期讲ListView的使用,相信都已经掌握好了吧。那么本期一起来学习Android5.X新增的一个列表组件,那就是RecyclerView的使用。一、RecyclerView概述从前面的学习我们知道,ListView的功能非常强大,几乎绝大部分应用程序都会使用到,虽然也学会一些方法</div> </li> <li><a href="/article/1891597219241455616.htm" title="J-OB烧录文件深入解析与应用指南" target="_blank">J-OB烧录文件深入解析与应用指南</a> <span class="text-muted">满天乱走</span> <div>本文还有配套的精品资源,点击获取简介:本文档为J-OB系列的烧录文件,创建于2020年,用于嵌入式系统中微控制器单元(MCU)的固件编程。烧录文件是将程序代码写入MCU闪存中的二进制文件,可包含固件代码、配置数据或设备驱动。本文将详细探讨烧录文件的应用,包括烧录过程、开发环境准备、代码编写、编译链接、烧录参数配置、编程器连接以及固件烧录和验证等关键步骤。1.嵌入式系统烧录文件概念嵌入式系统烧录文件</div> </li> <li><a href="/article/1891594179897782272.htm" title="使用 Docker 部署 RabbitMQ 的详细指南" target="_blank">使用 Docker 部署 RabbitMQ 的详细指南</a> <span class="text-muted">m0_74824552</span> <a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF/1.htm">学习路线</a><a class="tag" taget="_blank" href="/search/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4/1.htm">阿里巴巴</a><a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a><a class="tag" taget="_blank" href="/search/rabbitmq/1.htm">rabbitmq</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a> <div>使用Docker部署RabbitMQ的详细指南在现代应用程序开发中,消息队列系统是不可或缺的一部分。RabbitMQ是一个流行的开源消息代理软件,它实现了高级消息队列协议(AMQP)。本文将详细介绍如何使用Docker部署RabbitMQ,并提供一些配置和管理的技巧。1.前期准备在开始之前,请确保您的系统上已经安装了Docker。如果尚未安装,可以参考Docker官方文档或我写的前面一篇文章Cen</div> </li> <li><a href="/article/1891592415861600256.htm" title="v3-electron-vite项目快速入门指南" target="_blank">v3-electron-vite项目快速入门指南</a> <span class="text-muted">罗昭贝Lovely</span> <div>v3-electron-vite项目快速入门指南v3-electron-vite⭐Avue3electronadmintemplate,basedon'vite'项目地址:https://gitcode.com/gh_mirrors/v3e/v3-electron-vite本指南旨在帮助您了解并快速上手un-pany/v3-electron-vite这一基于Vue3与Vite的Electron管理</div> </li> <li><a href="/article/1891587629460287488.htm" title="如何在Python中进行JSON数据的序列化和反序列化?" target="_blank">如何在Python中进行JSON数据的序列化和反序列化?</a> <span class="text-muted">计算机学长大白</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>在Python中,JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。Python内置的json模块提供了简单易用的方法来实现数据的序列化和反序列化。下面将详细介绍如何在Python中进行JSON数据的序列化和反序列化,并给出具体的示例。1.序列化序列化是指将Python对象转换为JSON格式的字符串。json模块提供</div> </li> <li><a href="/article/1891584605434212352.htm" title="Pytorch实现mnist手写数字识别" target="_blank">Pytorch实现mnist手写数字识别</a> <span class="text-muted">Zn要学习</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>>-**本文为[365天深度学习训练营]中的学习记录博客**>-**原作者:[K同学啊]**我的环境:语言环境:Python3.8编译器:JupyterLab深度学习环境:torch==1.12.1+cu113torchvision==0.13.1+cu113一、前期准备1.设置GPU如果设备上支持GPU就使用GPU,否则使用CPUimporttorchimporttorch.nnasnnimpo</div> </li> <li><a href="/article/1891582336714207232.htm" title="python股票分析系统部署操作过程及代码实现" target="_blank">python股票分析系统部署操作过程及代码实现</a> <span class="text-muted">大懒猫软件</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/flask/1.htm">flask</a><a class="tag" taget="_blank" href="/search/plotly/1.htm">plotly</a><a class="tag" taget="_blank" href="/search/api/1.htm">api</a><a class="tag" taget="_blank" href="/search/restful/1.htm">restful</a> <div>部署一个股票分析系统涉及多个步骤,包括后端服务、前端界面和实时数据更新。以下是一个详细的部署过程,涵盖从代码编写到服务器部署的完整步骤。1.系统架构概述后端:使用Flask提供RESTfulAPI和数据处理服务。前端:使用PlotlyDash构建动态界面,实时显示股票价格走势。数据源:从金融数据API(如AlphaVantage、YahooFinance)获取实时数据。2.系统开发步骤2.1安装必</div> </li> <li><a href="/article/1891582330024292352.htm" title="运用python制作一个完整的股票分析系统" target="_blank">运用python制作一个完整的股票分析系统</a> <span class="text-muted">大懒猫软件</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/django/1.htm">django</a><a class="tag" taget="_blank" href="/search/beautifulsoup/1.htm">beautifulsoup</a> <div>使用python制作一个股票分析系统,可以通过股票价格走势动态界面,实时动态监测不同类型股票的变化情况。以下是一个完整的股票分析系统开发指南,包括股票价格走势动态界面和实时监测功能。这个系统将结合网络爬虫、数据分析、机器学习和可视化技术,帮助你实时监测不同类型股票的变化情况。1.系统功能概述数据采集:使用网络爬虫技术从财经网站采集股票数据。数据处理:计算技术指标(如KDJ、BOLL)并进行数据预处</div> </li> <li><a href="/article/1891578927214817280.htm" title="使用 Python 爬虫和 FFmpeg 爬取 B 站高清视频" target="_blank">使用 Python 爬虫和 FFmpeg 爬取 B 站高清视频</a> <span class="text-muted">大懒猫软件</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/ffmpeg/1.htm">ffmpeg</a> <div>以下是一个完整的Python爬虫代码示例,用于爬取B站视频并使用FFmpeg合成高清视频。1.准备工作确保安装了以下Python库和工具:bash复制pipinstallrequestsmoviepy2.爬取视频和音频文件B站的视频和音频文件通常是分开存储的,需要分别下载视频和音频文件,然后使用FFmpeg合成。Python复制importrequestsfrommoviepy.editorimp</div> </li> <li><a href="/article/1891574136136855552.htm" title="python爬虫模拟点击和输入,python爬虫实战--selenium模拟登录并自动点击" target="_blank">python爬虫模拟点击和输入,python爬虫实战--selenium模拟登录并自动点击</a> <span class="text-muted">半夜梳长长的头发</span> <a class="tag" taget="_blank" href="/search/python%E7%88%AC%E8%99%AB%E6%A8%A1%E6%8B%9F%E7%82%B9%E5%87%BB%E5%92%8C%E8%BE%93%E5%85%A5/1.htm">python爬虫模拟点击和输入</a> <div>爬虫实战项目。爬虫利器:selenium的使用。任务介绍最近刚刚注册了某个网站:HDHome,该站有新手考核任务,其中有一项是需要达到魔力值5000。在魔力值获取方式中,我们看到这一项:“说谢谢=0.5个魔力值”,而网站存活种子数量达到16000+,也就意味着对每个种子说一下谢谢,轻松达到8000+的魔力值,于是,这个项目应运而生。实现思路:获取种子的页面,在每个页面中找到说谢谢的按钮,并点击后,</div> </li> <li><a href="/article/1891574005127770112.htm" title="本地部署DeepSeek模型技术指南" target="_blank">本地部署DeepSeek模型技术指南</a> <span class="text-muted">Evaporator Core</span> <a class="tag" taget="_blank" href="/search/apache/1.htm">apache</a><a class="tag" taget="_blank" href="/search/Doris/1.htm">Doris</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/deepseek/1.htm">deepseek</a> <div>DeepSeek模型是一种先进的深度学习模型,广泛应用于自然语言处理、计算机视觉等领域。为了充分利用DeepSeek模型的强大功能,许多开发者和研究人员选择在本地环境中部署该模型。本文将详细介绍如何在本地环境中部署DeepSeek模型,包括环境准备、模型下载、配置、优化以及代码实现等内容。通过本文的指导,您将能够在本地成功部署并运行DeepSeek模型。1.环境准备在部署DeepSeek模型之前,</div> </li> <li><a href="/article/1891572493823569920.htm" title="LeetCode:142. 环形链表 II(python)" target="_blank">LeetCode:142. 环形链表 II(python)</a> <span class="text-muted">痴迷、淡然~</span> <a class="tag" taget="_blank" href="/search/LeetCode/1.htm">LeetCode</a><a class="tag" taget="_blank" href="/search/LeetCode/1.htm">LeetCode</a><a class="tag" taget="_blank" href="/search/142./1.htm">142.</a><a class="tag" taget="_blank" href="/search/%E7%8E%AF%E5%BD%A2%E9%93%BE%E8%A1%A8/1.htm">环形链表</a><a class="tag" taget="_blank" href="/search/II/1.htm">II</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>LeetCode:142.环形链表II(python)给定一个链表,返回链表开始入环的第一个节点。如果链表无环,则返回null。为了表示给定链表中的环,我们使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。如果pos是-1,则在该链表中没有环。说明:不允许修改给定的链表。示例1:输入:head=[3,2,0,-4],pos=1输出:tailconnectstonodeindex1解释:</div> </li> <li><a href="/article/1891571607361613824.htm" title="使用Python中的LangChain库优化消息长度:从聊天历史到模型性能的全面指南" target="_blank">使用Python中的LangChain库优化消息长度:从聊天历史到模型性能的全面指南</a> <span class="text-muted">m0_57781768</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/langchain/1.htm">langchain</a><a class="tag" taget="_blank" href="/search/easyui/1.htm">easyui</a> <div>使用Python中的LangChain库优化消息长度:从聊天历史到模型性能的全面指南在现代人工智能应用中,大语言模型(LLM)扮演着越来越重要的角色,尤其是在对话系统、智能助理和其他自然语言处理任务中。然而,所有的模型都有一个有限的上下文窗口,意味着它们可以处理的输入令牌(tokens)数量是有限的。当我们需要处理较长的对话历史或复杂的任务链时,如何管理传递给模型的消息长度变得至关重要。在这篇文章</div> </li> <li><a href="/article/1891570598375649280.htm" title="Window on arm编译onnxruntime的python安装包" target="_blank">Window on arm编译onnxruntime的python安装包</a> <span class="text-muted">lpcarl</span> <a class="tag" taget="_blank" href="/search/Windows/1.htm">Windows</a><a class="tag" taget="_blank" href="/search/on/1.htm">on</a><a class="tag" taget="_blank" href="/search/arm%E5%BC%80%E5%8F%91/1.htm">arm开发</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/WOA/1.htm">WOA</a><a class="tag" taget="_blank" href="/search/Windows/1.htm">Windows</a><a class="tag" taget="_blank" href="/search/on/1.htm">on</a><a class="tag" taget="_blank" href="/search/arm/1.htm">arm</a><a class="tag" taget="_blank" href="/search/onnx/1.htm">onnx</a> <div>Windowonarm编译onnxruntime_qnn的python安装包准备工作开始安装准备工作1.下载onnxruntime的源码gitclonehttps://github.com/microsoft/onnxruntime.git2.安装vsstudio下载visualstudio安装包,并在线安装visualstudio2022版本,安装完成后安装“c++桌面应用开发”相关的组件下载c</div> </li> <li><a href="/article/1891569964133969920.htm" title="知识图谱neo4j—利用python进行知识入库" target="_blank">知识图谱neo4j—利用python进行知识入库</a> <span class="text-muted">gcl_code</span> <a class="tag" taget="_blank" href="/search/%E7%9F%A5%E8%AF%86%E5%9B%BE%E8%B0%B1/1.htm">知识图谱</a><a class="tag" taget="_blank" href="/search/neo4j/1.htm">neo4j</a><a class="tag" taget="_blank" href="/search/%E7%9F%A5%E8%AF%86%E5%9B%BE%E8%B0%B1/1.htm">知识图谱</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>知识图谱neo4j—利用python进行知识入库知识图谱—利用python进行知识入库作为一个写sql出生的菜鸡,在这里分享一下去年11月到12月之间研究的关于知识图谱的课题相关知识,由于客户的原因最终该项目没有继续进行下去,但是有些经验还是可以跟大家分享一下,理论知识就不说了,很多人已经有类似的分享了,这边分享一个我自己用python写的导入neo4j的脚本,能达到1秒入库4000条左右记录数据</div> </li> <li><a href="/article/1891569712035328000.htm" title="JAVA和Python的区别" target="_blank">JAVA和Python的区别</a> <span class="text-muted">草莓味的¥猪</span> <a class="tag" taget="_blank" href="/search/%E8%AF%AD%E8%A8%80/1.htm">语言</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>一、整体区别语法结构:Java是一种面向对象的编程语言,采用了类和对象的概念,需要使用大括号“{}”来定义代码块和方法。而Python是一种动态类型的编程语言,使用缩进来表示代码块的层级结构,不需要显式地定义类和对象。编程范式:Java是一种静态类型的编程语言,需要在编译时进行类型检查,并且必须声明变量的数据类型。Python是一种动态类型的编程语言,变量的数据类型是根据赋值而确定的,不需要显式声</div> </li> <li><a href="/article/1891566810860417024.htm" title="python的selenium库模拟输入和点击" target="_blank">python的selenium库模拟输入和点击</a> <span class="text-muted">mangge08</span> <a class="tag" taget="_blank" href="/search/selenium/1.htm">selenium</a><a class="tag" taget="_blank" href="/search/%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7/1.htm">测试工具</a> <div>使用python打开已经登录的谷歌浏览器,模拟录入文本提交数据。1、执行命令行,系统会打开浏览器,手工登录"C:\ProgramFiles\Google\Chrome\Application\chrome.exe"--remote-debugging-port=9223--user-data-dir="C:\tmp"2、下载谷歌驱动,先看谷歌版本,再谷歌地址栏输入:chrome://setting</div> </li> <li><a href="/article/1891550160618582016.htm" title="python的django后台管理_python3 django-admin 初始化后台管理项目(mysql)" target="_blank">python的django后台管理_python3 django-admin 初始化后台管理项目(mysql)</a> <span class="text-muted">weixin_39582737</span> <div>环境和工具python3djangomysqlPyCharm$python3--versionPython3.7.0$django-admin--version2.2python3和django安装django初始化项目使用django-admin来初始化一个项目$django-adminstartprojectmydjango$cdmydjango$tree.├──manage.py#与该Dja</div> </li> <li><a href="/article/1891549908222144512.htm" title="android adb 查看系统主频,hp adb命令,查看内存,CPU主频等信息。" target="_blank">android adb 查看系统主频,hp adb命令,查看内存,CPU主频等信息。</a> <span class="text-muted">三木在Yummy</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/adb/1.htm">adb</a><a class="tag" taget="_blank" href="/search/%E6%9F%A5%E7%9C%8B%E7%B3%BB%E7%BB%9F%E4%B8%BB%E9%A2%91/1.htm">查看系统主频</a> <div>Theadbcommandprovidesawaytogainusefulinformationaboutanumberofthesystemsconfigurationareas.Todeterminethephysicalmemory(RAM):forHP-UX10xexample:echophysmem/D|adb/stand/vmunix/dev/kmemphysmem:physmem:2</div> </li> <li><a href="/article/1891547502612639744.htm" title="Java中代码的执行顺序(Java基础)" target="_blank">Java中代码的执行顺序(Java基础)</a> <span class="text-muted">Java搬码工</span> <a class="tag" taget="_blank" href="/search/javaSE/1.htm">javaSE</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>在Java里,不同类型代码有着特定的执行顺序,理解这些顺序对掌握程序运行逻辑十分关键。下面将详细阐述Java中不同类型代码(静态代码块、实例代码块、构造方法、静态变量、实例变量、静态方法、实例方法等)的执行顺序。单类中的代码执行顺序当只有一个类时,代码执行顺序通常为:静态变量初始化、静态代码块、实例变量初始化、实例代码块、构造方法。classSingleClassExample{//静态变量sta</div> </li> <li><a href="/article/1891545863424110592.htm" title="Django之admin后台管理" target="_blank">Django之admin后台管理</a> <span class="text-muted">除却巫山不是云@</span> <a class="tag" taget="_blank" href="/search/django/1.htm">django</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a> <div>admin配置步骤:1.创建后台管理账号输入命令pythonmanage.pycreatesuperuser之后,设置用户名,密码,邮箱。输入命令pythonmanage.pyrunserver启动项目,打开127.0.0.1:8000/admin/进入后台管理界面,截图如下:输入设置的用户名和密码即可登录。如下所示:</div> </li> <li><a href="/article/1891545737129422848.htm" title="掌握SQLite_轻量级数据库的全面指南" target="_blank">掌握SQLite_轻量级数据库的全面指南</a> <span class="text-muted">随风九天</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%8C%A0%E5%BF%83%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">匠心数据库</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/sqlite/1.htm">sqlite</a> <div>1.引言1.1SQLite简介SQLite是一个嵌入式关系型数据库管理系统,它不需要单独的服务器进程或系统配置。它的设计目标是简单、高效、可靠,适用于各种应用场景,尤其是移动设备和嵌入式系统。1.2为什么选择SQLite轻量级:文件大小通常在几百KB到几MB之间。无服务器架构:不需要单独的服务器进程。跨平台支持:支持多种操作系统和编程语言。事务支持:支持ACID事务。1.3适用场景与限制适用场景:</div> </li> <li><a href="/article/1891544347632005120.htm" title="open3d python 分割多个平面" target="_blank">open3d python 分割多个平面</a> <span class="text-muted">黄晓魚</span> <a class="tag" taget="_blank" href="/search/halcon3d/1.htm">halcon3d</a><a class="tag" taget="_blank" href="/search/PCL%E7%82%B9%E4%BA%91%E5%A4%84%E7%90%86/1.htm">PCL点云处理</a><a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C/1.htm">深度神经网络</a><a class="tag" taget="_blank" href="/search/%E7%82%B9%E4%BA%91%E5%A4%84%E7%90%86/1.htm">点云处理</a><a class="tag" taget="_blank" href="/search/PCL%E5%BA%93/1.htm">PCL库</a><a class="tag" taget="_blank" href="/search/Open3D%E5%BA%93/1.htm">Open3D库</a><a class="tag" taget="_blank" href="/search/Point%2B%2B%E6%A8%A1%E5%9E%8B%E4%BD%BF%E7%94%A8/1.htm">Point++模型使用</a><a class="tag" taget="_blank" href="/search/%E5%B9%B3%E9%9D%A2/1.htm">平面</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/open3d/1.htm">open3d</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>测试效果废话在Open3D中,detect_planar_patches方法用于从点云数据中检测平面区域(或称为平面补丁)。这个方法通过分析点云中各点之间的法线向量和方向性来识别具有相似法线向量的点群,从而识别出潜在的平面区域。下面是对你给出的代码行中各个参数的解释:normal_variance_threshold_deg:法线向量方差阈值(以度为单位)。这个参数设定了允许的点云中法线向量方向变</div> </li> <li><a href="/article/1891543591369633792.htm" title="ChatGPT 提示词全网最全案例汇总" target="_blank">ChatGPT 提示词全网最全案例汇总</a> <span class="text-muted">编程IT圈</span> <a class="tag" taget="_blank" href="/search/chatgpt/1.htm">chatgpt</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a> <div>GPT地址,收藏不迷路:https://ai.cxyquan.com/ChatGPT提示词案例分享充当旅游指南我想让你做一个旅游指南。我会把我的位置写给你,你会推荐一个靠近我的位置的地方。在某些情况下,我还会告诉您我将访问的地方类型。您还会向我推荐靠近我的第一个位置的类似类型的地方。我的第一个建议请求是“我在上海,我只想参观博物馆。”充当时间旅行指南我要你做我的时间旅行向导。我会为您提供我想参观的</div> </li> <li><a href="/article/1891541823717961728.htm" title="Altium Designer(AD)仿真实验操作指南" target="_blank">Altium Designer(AD)仿真实验操作指南</a> <span class="text-muted">逼子歌</span> <a class="tag" taget="_blank" href="/search/Altium/1.htm">Altium</a><a class="tag" taget="_blank" href="/search/%E7%A1%AC%E4%BB%B6%E5%B7%A5%E7%A8%8B%E5%B8%88%E7%AC%94%E8%AF%95%E9%9D%A2%E8%AF%95%E9%A2%98%E7%9B%AE%E6%B1%87%E6%80%BB/1.htm">硬件工程师笔试面试题目汇总</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E7%89%87%E6%9C%BA/1.htm">单片机</a><a class="tag" taget="_blank" href="/search/%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%A1%AC%E4%BB%B6/1.htm">嵌入式硬件</a><a class="tag" taget="_blank" href="/search/%E7%A1%AC%E4%BB%B6%E5%B7%A5%E7%A8%8B%E5%B8%88/1.htm">硬件工程师</a><a class="tag" taget="_blank" href="/search/%E7%A1%AC%E4%BB%B6%E6%B5%8B%E8%AF%95/1.htm">硬件测试</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a><a class="tag" taget="_blank" href="/search/AD%E4%BB%BF%E7%9C%9F%E5%AE%9E%E9%AA%8C/1.htm">AD仿真实验</a><a class="tag" taget="_blank" href="/search/Altium/1.htm">Altium</a><a class="tag" taget="_blank" href="/search/Designer/1.htm">Designer</a> <div>目录1、创建原理图1.1创建原理图1.2点击simulate1.3仿真模块介绍2、绘制原理图2.1二极管半波整流电路仿真为例2.2放置电源模块2.3器件选择2.4放置电器元件2.5连线及GND3、设置参数3.1设置电源参数3.2波形类型3.3电源设置3.4二极管设置3.5电阻设置3.6测试探头3.7测试探头命名4、实验结果4.1运行仿真4.2实验结果4.3OperatingPoint:工作点4.4</div> </li> <li><a href="/article/46.htm" title="Maven" target="_blank">Maven</a> <span class="text-muted">Array_06</span> <a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a><a class="tag" taget="_blank" href="/search/jdk/1.htm">jdk</a><a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a> <div>Maven Maven是基于项目对象模型(POM), 信息来管理项目的构建,报告和文档的软件项目管理工具。 Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目。由于 Maven 的面向项目的方法,许多 Apache Jakarta 项目发文时使用 Maven,而且公司</div> </li> <li><a href="/article/173.htm" title="ibatis的queyrForList和queryForMap区别" target="_blank">ibatis的queyrForList和queryForMap区别</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/ibatis/1.htm">ibatis</a> <div>一.说明         iBatis的返回值参数类型也有种:resultMap与resultClass,这两种类型的选择可以用两句话说明之:         1.当结果集列名和类的属性名完全相对应的时候,则可直接用resultClass直接指定查询结果类</div> </li> <li><a href="/article/300.htm" title="LeetCode[位运算] - #191 计算汉明权重" target="_blank">LeetCode[位运算] - #191 计算汉明权重</a> <span class="text-muted">Cwind</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E4%BD%8D%E8%BF%90%E7%AE%97/1.htm">位运算</a><a class="tag" taget="_blank" href="/search/LeetCode/1.htm">LeetCode</a><a class="tag" taget="_blank" href="/search/Algorithm/1.htm">Algorithm</a><a class="tag" taget="_blank" href="/search/%E9%A2%98%E8%A7%A3/1.htm">题解</a> <div>原题链接:#191 Number of 1 Bits 要求: 写一个函数,以一个无符号整数为参数,返回其汉明权重。例如,‘11’的二进制表示为'00000000000000000000000000001011', 故函数应当返回3。 汉明权重:指一个字符串中非零字符的个数;对于二进制串,即其中‘1’的个数。 难度:简单 分析: 将十进制参数转换为二进制,然后计算其中1的个数即可。 “</div> </li> <li><a href="/article/427.htm" title="浅谈java类与对象" target="_blank">浅谈java类与对象</a> <span class="text-muted">15700786134</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>      java是一门面向对象的编程语言,类与对象是其最基本的概念。所谓对象,就是一个个具体的物体,一个人,一台电脑,都是对象。而类,就是对象的一种抽象,是多个对象具有的共性的一种集合,其中包含了属性与方法,就是属于该类的对象所具有的共性。当一个类创建了对象,这个对象就拥有了该类全部的属性,方法。相比于结构化的编程思路,面向对象更适用于人的思维</div> </li> <li><a href="/article/554.htm" title="linux下双网卡同一个IP" target="_blank">linux下双网卡同一个IP</a> <span class="text-muted">被触发</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>转自: http://q2482696735.blog.163.com/blog/static/250606077201569029441/ 由于需要一台机器有两个网卡,开始时设置在同一个网段的IP,发现数据总是从一个网卡发出,而另一个网卡上没有数据流动。网上找了下,发现相同的问题不少: 一、 关于双网卡设置同一网段IP然后连接交换机的时候出现的奇怪现象。当时没有怎么思考、以为是生成树</div> </li> <li><a href="/article/681.htm" title="安卓按主页键隐藏程序之后无法再次打开" target="_blank">安卓按主页键隐藏程序之后无法再次打开</a> <span class="text-muted">肆无忌惮_</span> <a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%8D%93/1.htm">安卓</a> <div>遇到一个奇怪的问题,当SplashActivity跳转到MainActivity之后,按主页键,再去打开程序,程序没法再打开(闪一下),结束任务再开也是这样,只能卸载了再重装。而且每次在Log里都打印了这句话"进入主程序"。后来发现是必须跳转之后再finish掉SplashActivity   本来代码:   // 销毁这个Activity fin</div> </li> <li><a href="/article/808.htm" title="通过cookie保存并读取用户登录信息实例" target="_blank">通过cookie保存并读取用户登录信息实例</a> <span class="text-muted">知了ing</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a> <div>通过cookie的getCookies()方法可获取所有cookie对象的集合;通过getName()方法可以获取指定的名称的cookie;通过getValue()方法获取到cookie对象的值。另外,将一个cookie对象发送到客户端,使用response对象的addCookie()方法。 下面通过cookie保存并读取用户登录信息的例子加深一下理解。 (1)创建index.jsp文件。在改</div> </li> <li><a href="/article/935.htm" title="JAVA 对象池" target="_blank">JAVA 对象池</a> <span class="text-muted">矮蛋蛋</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/ObjectPool/1.htm">ObjectPool</a> <div>原文地址: http://www.blogjava.net/baoyaer/articles/218460.html Jakarta对象池       ☆为什么使用对象池   恰当地使用对象池化技术,可以有效地减少对象生成和初始化时的消耗,提高系统的运行效率。Jakarta Commons Pool组件提供了一整套用于实现对象池化</div> </li> <li><a href="/article/1062.htm" title="ArrayList根据条件+for循环批量删除的方法" target="_blank">ArrayList根据条件+for循环批量删除的方法</a> <span class="text-muted">alleni123</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>场景如下: ArrayList<Obj> list Obj-> createTime, sid. 现在要根据obj的createTime来进行定期清理。(释放内存) ------------------------- 首先想到的方法就是 for(Obj o:list){ if(o.createTime-currentT>xxx){ </div> </li> <li><a href="/article/1189.htm" title="阿里巴巴“耕地宝”大战各种宝" target="_blank">阿里巴巴“耕地宝”大战各种宝</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/%E5%B9%B3%E5%8F%B0%E6%88%98%E7%95%A5/1.htm">平台战略</a> <div>“耕地保”平台是阿里巴巴和安徽农民共同推出的一个 “首个互联网定制私人农场”,“耕地宝”由阿里巴巴投入一亿 ,主要是用来进行农业方面,将农民手中的散地集中起来 不仅加大农民集体在土地上面的话语权,还增加了土地的流通与 利用率,提高了土地的产量,有利于大规模的产业化的高科技农业的 发展,阿里在农业上的探索将会引起新一轮的产业调整,但是集体化之后农民的个体的话语权 将更少,国家应出台相应的法律法规保护</div> </li> <li><a href="/article/1316.htm" title="Spring注入有继承关系的类(1)" target="_blank">Spring注入有继承关系的类(1)</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a> <div>一个类一个类的注入 1.AClass类 package com.bijian.spring.test2; public class AClass { String a; String b; public String getA() { return a; } public void setA(Strin</div> </li> <li><a href="/article/1443.htm" title="30岁转型期你能否成为成功人士" target="_blank">30岁转型期你能否成为成功人士</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/%E6%88%90%E5%8A%9F/1.htm">成功</a> <div>        很多人由于年轻时走了弯路,到了30岁一事无成,这样的例子大有人在。但同样也有一些人,整个职业生涯都发展得很优秀,到了30岁已经成为职场的精英阶层。由于做猎头的原因,我们接触很多30岁左右的经理人,发现他们在职业发展道路上往往有很多致命的问题。在30岁之前,他们的职业生涯表现很优秀,但从30岁到40岁这一段,很多人</div> </li> <li><a href="/article/1570.htm" title="[Velocity三]基于Servlet+Velocity的web应用" target="_blank">[Velocity三]基于Servlet+Velocity的web应用</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/velocity/1.htm">velocity</a> <div>什么是VelocityViewServlet 使用org.apache.velocity.tools.view.VelocityViewServlet可以将Velocity集成到基于Servlet的web应用中,以Servlet+Velocity的方式实现web应用   Servlet + Velocity的一般步骤 1.自定义Servlet,实现VelocityViewServl</div> </li> <li><a href="/article/1697.htm" title="【Kafka十二】关于Kafka是一个Commit Log Service" target="_blank">【Kafka十二】关于Kafka是一个Commit Log Service</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/service/1.htm">service</a> <div>Kafka is a distributed, partitioned, replicated commit log service.这里的commit log如何理解?   A message is considered "committed" when all in sync replicas for that partition have applied i</div> </li> <li><a href="/article/1824.htm" title="NGINX + LUA实现复杂的控制" target="_blank">NGINX + LUA实现复杂的控制</a> <span class="text-muted">ronin47</span> <a class="tag" taget="_blank" href="/search/lua+nginx+%E6%8E%A7%E5%88%B6/1.htm">lua nginx 控制</a> <div>安装lua_nginx_module 模块 lua_nginx_module 可以一步步的安装,也可以直接用淘宝的OpenResty Centos和debian的安装就简单了。。 这里说下freebsd的安装: fetch http://www.lua.org/ftp/lua-5.1.4.tar.gz tar zxvf lua-5.1.4.tar.gz cd lua-5.1.4 ma</div> </li> <li><a href="/article/1951.htm" title="java-14.输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字" target="_blank">java-14.输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div> public class TwoElementEqualSum { /** * 第 14 题: 题目:输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。 要求时间复杂度是 O(n) 。如果有多对数字的和等于输入的数字,输出任意一对即可。 例如输入数组 1 、 2 、 4 、 7 、 11 、 15 和数字 15 。由于 </div> </li> <li><a href="/article/2078.htm" title="Netty源码学习-HttpChunkAggregator-HttpRequestEncoder-HttpResponseDecoder" target="_blank">Netty源码学习-HttpChunkAggregator-HttpRequestEncoder-HttpResponseDecoder</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/netty/1.htm">netty</a> <div>今天看Netty如何实现一个Http Server org.jboss.netty.example.http.file.HttpStaticFileServerPipelineFactory: pipeline.addLast("decoder", new HttpRequestDecoder()); pipeline.addLast(&quo</div> </li> <li><a href="/article/2205.htm" title="java敏感词过虑-基于多叉树原理" target="_blank">java敏感词过虑-基于多叉树原理</a> <span class="text-muted">cngolon</span> <a class="tag" taget="_blank" href="/search/%E8%BF%9D%E7%A6%81%E8%AF%8D%E8%BF%87%E8%99%91/1.htm">违禁词过虑</a><a class="tag" taget="_blank" href="/search/%E6%9B%BF%E6%8D%A2%E8%BF%9D%E7%A6%81%E8%AF%8D/1.htm">替换违禁词</a><a class="tag" taget="_blank" href="/search/%E6%95%8F%E6%84%9F%E8%AF%8D%E8%BF%87%E8%99%91/1.htm">敏感词过虑</a><a class="tag" taget="_blank" href="/search/%E5%A4%9A%E5%8F%89%E6%A0%91/1.htm">多叉树</a> <div>基于多叉树的敏感词、关键词过滤的工具包,用于java中的敏感词过滤 1、工具包自带敏感词词库,第一次调用时读入词库,故第一次调用时间可能较长,在类加载后普通pc机上html过滤5000字在80毫秒左右,纯文本35毫秒左右。   2、如需自定义词库,将jar包考入WEB-INF工程的lib目录,在WEB-INF/classes目录下建一个 utf-8的words.dict文本文件,</div> </li> <li><a href="/article/2332.htm" title="多线程知识" target="_blank">多线程知识</a> <span class="text-muted">cuishikuan</span> <a class="tag" taget="_blank" href="/search/%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">多线程</a> <div> T1,T2,T3三个线程工作顺序,按照T1,T2,T3依次进行 public class T1 implements Runnable{           @Override      </div> </li> <li><a href="/article/2459.htm" title="spring整合activemq" target="_blank">spring整合activemq</a> <span class="text-muted">dalan_123</span> <a class="tag" taget="_blank" href="/search/java+spring+jms/1.htm">java spring jms</a> <div>整合spring和activemq需要搞清楚如下的东东1、ConnectionFactory分:     a、spring管理连接到activemq服务器的管理ConnectionFactory也即是所谓产生到jms服务器的链接      b、真正产生到JMS服务器链接的ConnectionFactory还得</div> </li> <li><a href="/article/2586.htm" title="MySQL时间字段究竟使用INT还是DateTime?" target="_blank">MySQL时间字段究竟使用INT还是DateTime?</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>  环境:Windows XPPHP Version 5.2.9MySQL Server 5.1 第一步、创建一个表date_test(非定长、int时间) CREATE TABLE `test`.`date_test` (`id` INT NOT NULL AUTO_INCREMENT ,`start_time` INT NOT NULL ,`some_content`</div> </li> <li><a href="/article/2713.htm" title="Parcel: unable to marshal value" target="_blank">Parcel: unable to marshal value</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/marshal/1.htm">marshal</a> <div>在两个activity直接传递List<xxInfo>时,出现Parcel: unable to marshal value异常。   在MainActivity页面(MainActivity页面向NextActivity页面传递一个List<xxInfo>):   Intent intent = new Intent(this, Next</div> </li> <li><a href="/article/2840.htm" title="linux进程的查看上(ps)" target="_blank">linux进程的查看上(ps)</a> <span class="text-muted">eksliang</span> <a class="tag" taget="_blank" href="/search/linux+ps/1.htm">linux ps</a><a class="tag" taget="_blank" href="/search/linux+ps+-l/1.htm">linux ps -l</a><a class="tag" taget="_blank" href="/search/linux+ps+aux/1.htm">linux ps aux</a> <div>ps:将某个时间点的进程运行情况选取下来 转载请出自出处:http://eksliang.iteye.com/admin/blogs/2119469 http://eksliang.iteye.com         ps 这个命令的man page 不是很好查阅,因为很多不同的Unix都使用这儿ps来查阅进程的状态,为了要符合不同版本的需求,所以这个</div> </li> <li><a href="/article/2967.htm" title="为什么第三方应用能早于System的app启动" target="_blank">为什么第三方应用能早于System的app启动</a> <span class="text-muted">gqdy365</span> <a class="tag" taget="_blank" href="/search/System/1.htm">System</a> <div>Android应用的启动顺序网上有一大堆资料可以查阅了,这里就不细述了,这里不阐述ROM启动还有bootloader,软件启动的大致流程应该是启动kernel -> 运行servicemanager 把一些native的服务用命令启动起来(包括wifi, power, rild, surfaceflinger, mediaserver等等)-> 启动Dalivk中的第一个进程Zygot</div> </li> <li><a href="/article/3094.htm" title="App Framework发送JSONP请求(3)" target="_blank">App Framework发送JSONP请求(3)</a> <span class="text-muted">hw1287789687</span> <a class="tag" taget="_blank" href="/search/jsonp/1.htm">jsonp</a><a class="tag" taget="_blank" href="/search/%E8%B7%A8%E5%9F%9F%E8%AF%B7%E6%B1%82/1.htm">跨域请求</a><a class="tag" taget="_blank" href="/search/%E5%8F%91%E9%80%81jsonp/1.htm">发送jsonp</a><a class="tag" taget="_blank" href="/search/ajax%E8%AF%B7%E6%B1%82/1.htm">ajax请求</a><a class="tag" taget="_blank" href="/search/%E8%B6%8A%E7%8B%B1%E8%AF%B7%E6%B1%82/1.htm">越狱请求</a> <div>App Framework 中如何发送JSONP请求呢? 使用jsonp,详情请参考:http://json-p.org/ 如何发送Ajax请求呢? (1)登录 /*** * 会员登录 * @param username * @param password */ var user_login=function(username,password){ // aler</div> </li> <li><a href="/article/3221.htm" title="发福利,整理了一份关于“资源汇总”的汇总" target="_blank">发福利,整理了一份关于“资源汇总”的汇总</a> <span class="text-muted">justjavac</span> <a class="tag" taget="_blank" href="/search/%E8%B5%84%E6%BA%90/1.htm">资源</a> <div>觉得有用的话,可以去github关注:https://github.com/justjavac/awesome-awesomeness-zh_CN 通用 free-programming-books-zh_CN 免费的计算机编程类中文书籍 精彩博客集合 hacke2/hacke2.github.io#2 ResumeSample 程序员简历</div> </li> <li><a href="/article/3348.htm" title="用 Java 技术创建 RESTful Web 服务" target="_blank">用 Java 技术创建 RESTful Web 服务</a> <span class="text-muted">macroli</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B/1.htm">编程</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/REST/1.htm">REST</a> <div>转载:http://www.ibm.com/developerworks/cn/web/wa-jaxrs/   JAX-RS (JSR-311) 【 Java API for RESTful Web Services 】是一种 Java™ API,可使 Java Restful 服务的开发变得迅速而轻松。这个 API 提供了一种基于注释的模型来描述分布式资源。注释被用来提供资源的位</div> </li> <li><a href="/article/3475.htm" title="CentOS6.5-x86_64位下oracle11g的安装详细步骤及注意事项" target="_blank">CentOS6.5-x86_64位下oracle11g的安装详细步骤及注意事项</a> <span class="text-muted">超声波</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>前言: 这两天项目要上线了,由我负责往服务器部署整个项目,因此首先要往服务器安装oracle,服务器本身是CentOS6.5的64位系统,安装的数据库版本是11g,在整个的安装过程中碰到很多的坑,不过最后还是通过各种途径解决并成功装上了。转别写篇博客来记录完整的安装过程以及在整个过程中的注意事项。希望对以后那些刚刚接触的菜鸟们能起到一定的帮助作用。   安装过程中可能遇到的问题(注</div> </li> <li><a href="/article/3602.htm" title="HttpClient 4.3 设置keeplive 和 timeout 的方法" target="_blank">HttpClient 4.3 设置keeplive 和 timeout 的方法</a> <span class="text-muted">supben</span> <a class="tag" taget="_blank" href="/search/httpclient/1.htm">httpclient</a> <div>ConnectionKeepAliveStrategy kaStrategy = new DefaultConnectionKeepAliveStrategy() { @Override public long getKeepAliveDuration(HttpResponse response, HttpContext context) { long keepAlive</div> </li> <li><a href="/article/3729.htm" title="Spring 4.2新特性-@Import注解的升级" target="_blank">Spring 4.2新特性-@Import注解的升级</a> <span class="text-muted">wiselyman</span> <a class="tag" taget="_blank" href="/search/spring+4/1.htm">spring 4</a> <div>3.1 @Import @Import注解在4.2之前只支持导入配置类 在4.2,@Import注解支持导入普通的java类,并将其声明成一个bean 3.2 示例 演示java类 package com.wisely.spring4_2.imp; public class DemoService { public void doSomethin</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>