python的轻量级数据库对象序列化器。
SPODS的Python项目详细描述
#简单的python对象数据库序列化器(spods)
有时,我们只想保存持久性数据,而不必担心sql注入、事务问题和连接问题。
spod最终有了另一种选择。spods是一个简单、轻量级、易于使用的替代重序列化库。spods还提供了一种访问通用python对象的好方法。
现在,spods甚至通过cgi脚本为您的数据库提供了一个免费的json接口。
将spods.py复制到要在其中使用它的目录。
使用以下方法包括它:
``python
>; ````
类。
首先,创建一组"field"对象并将它们存储在"table"中:
``python
>;>fields=[
…字段('id',int,pk=true),
…字段('title',str),
…字段('isbn',int),
…字段('condition',bool)
…]
…
>;>;book s\u table=table('book',fields)
````
现在是将表链接到数据库并开始创建对象的时候了。为此,只需连接到数据库并调用"create_linked_class(table,connection)"函数:
``python
>;>import sqlite3
>;>con=sqlite3.connect("database.db")
>; ```
恭喜!您刚刚在"database.db"中创建了一个数据库,并准备开始在其中存储"book"。如果books表不存在,spods将自动为您创建该表。
您可以运行如下命令:
``python
>;>book=book()
>;>book
{id:1,'title':none,'isbn':none,'condition':none}
````
还可以通过提供现有book对象的id来访问该对象:
`` python
>;>>book.title='笔记本'
>;>book.title
'笔记本'
>;>现有book=book(id=1)
>;>现有book
{id:1,'title':'the notebook','isbn':none,'condition':none}
````
>您也可以通过不指定id来创建新对象:
``python
>;book=book(title='atlas')
>;book.title
"atlas"
````
``使用spods对象
可以对属性使用所有常用的getter和setter方法,例如:
`` python
>;>x.id=7
>;x.id
7
```
>以及类似字典的访问:
``python
>;>x['id']=7
>;>x['id']
7
```
x[字段]=7
>;>;x.id
7
````
x['id']==none
true
```
>或者,等价地:
``python
>;>;x.id=5
>;>;del x.id
>;>;x.id==none
`true
```
只需删除它的主键:
`` python
>;>>del x.id;del x
```
**警告:**不要删除项目的主键后尝试访问该项目。最安全的做法是直接删除对象!
与数据库同步
所有*更新*、*插入*和*删除*将自动与数据库同步。所以别担心!
如果出于某种原因,您需要确保行已同步,则可以手动调用同步函数:
``python
>;>x.read廑sync();从数据库中读取所有值,替换x的本地副本
>;>x.write廑sync();将所有值写入数据库,替换数据库的值
```
要建立一对多关系,请使用以下语法:
``python
>;>;book.has-one(author)
``
一个新列。
现在,您可以使用主键将两个对象关联起来:
``python
>;>book=book(title='harry potter')
>;>author=author(name='j k rowling')
>; 1
>;b.作者id=1
````
…通过第一个访问相关对象!
``python
>;>book['author'].name
'j k rowling'
>;>book['author'].id
1
````
**注意:spods的当前版本不支持对关系的属性访问(例如上面示例中的"b.author")。我们正在努力解决这个问题,但目前只支持字典访问(例如"b['author']`)。*
\json api
现在是您想要使用spod的真正原因。spods附带了一个非常简单的自动生成的json api,可以在任何web应用程序中使用。
作者)
>;>result
…
```
`serve_api`将读取请求访问api的用户的cookies和表单数据,并返回要打印到网页的字符串。
<;!--api将返回"200 ok"、"400 bad request"或"401 unauthorized"响应代码。-->;
json结果包含3个字段:
*`status`,成功时为0,失败时为非零(一般错误为正,授权/权限错误为负)
*`error`,其中包含描述错误的错误消息
*`data`,其中包含受请求影响的对象(字典格式)
*例如`[{"id":2,"title":"正义得到伸张","author_id":1},{"id":3,"title":"地球上最美好的一天","author_id":2}`
api请求的格式如下:
(`{}"括号表示一个参数,`()`方括号表示默认值,`[]`方括号表示可选值:
```
http://www.yourdomain.com/api.py?
obj={<;table_u name>;}
[&;action={(view)add edit delete}]
[&;field>;={<;value>;}]
if action!=添加:
[&fetch={(all)one}
如果fetch=all:
[&;start={(0)number>;=0}]
[&;limit={(<;max_limit>;number>;=0}]
```
所有保留请求值(除了`<;`'s中的值外)都区分大小写-**in**。表名、字段名和字段值区分大小写。
把所有叫做"绿野仙踪"的书改名为"绿野女巫",你可以使用:
```
http://www.yourdomain.com/api.py?
obj=books
&fetch=one
&action=edit
&;*name='the wizard of oz'
&name='the witch of oz'
````
任何一个:
```
&;*name*='绿野仙踪'
&;**name**='绿野仙踪'
&;***name**='绿野仙踪'
```
你可以使用:
```
http://www.yourdomain.com/api.py?
obj=books
&fetch=one
&action=delete
&name='the wizard of oz'
````
obj=books
&fetch=all
&action=view
&author\u id=7
````
obj=books
&author\u id=7
````
注意:
*post数据也被接受,而不仅仅是get data
*事实上,任何cgi数据,一般来说,接受
*忽略未识别的参数
{
数据类型:'json',
数据:{
obj:'books',//我们想要得到的东西
fetch:'all',//我们想要多少
操作:'view',//what we want to do with them
///过滤参数
作者ID:7
},
成功:函数(json){
如果(json.status==0){
/成功!用json做一些事情
$。每个(json.data,函数(i,e){
alert("book"+i+"被称为"+e.title+");
});
}其他{
///错误:应用程序方面出了问题
//查看"error"字段以获取详细信息
alert("error:"+json.error);
}
},
error:function(){
///共有问题:连接问题,等等
alert("出现严重错误!");
}
};
````
我们需要的是一个可定制的接口,它允许各种扩展,并且不会破坏内部。幸运的是,spods在处理定制方面非常出色。
或者,您可能希望编写自己的api函数,这些函数仍然可以访问数据,但可以执行自定义操作。为此,您可以使用**自定义API函数**。
这很简单。首先,定义函数:
`` python
>;>>def credit_checksum(**kw):
…如果"信用卡"不是kw或不是kw["信用卡"].isDigit():
…引发异常("请输入有效的信用卡号码。")
…贷方金额=0
…对于kw中的数字[信用卡]:
…贷方金额+=整数(数字)
…返回{'sum':credit\u sum}
…
``
(注意函数如何获取*关键字参数`**kw`*,并返回*可序列化的python对象*。这对于json转换很重要。)
`**kw`*参数是CGI输入数据(如URL)。还有一些特殊的值:
*`''u cookie'`是来自用户的cookie对象(如果它不是空的话将被发送回用户)
*`''u classes'`是传递到'serve api()`
*的所有类对象的列表,例如,要检查您的api是否提供"person"对象,您可以检查"if person in kw['''u classes']`
*另一个很好的用法是不通过api提供特定对象,并通过自定义函数强制访问该对象,例如,提供对"user"对象(可能包含密码等)的默认api访问可能会带来安全风险
现在,在注册api时,只需传入函数(以及您希望响应的任何类):
``python
>;result=spods.serve_api(book,author,credit_checksum)
>;
…
````
obj=信用卡校验和
&credit卡=123492384342
`````
,响应如下:
``json
{"status":0,"error":","data":{"sum":45}
```
##就是这样!
您现在知道了所有关于spod的知识,并将其集成到您的应用程序中。
-)
有时,我们只想保存持久性数据,而不必担心sql注入、事务问题和连接问题。
spod最终有了另一种选择。spods是一个简单、轻量级、易于使用的替代重序列化库。spods还提供了一种访问通用python对象的好方法。
现在,spods甚至通过cgi脚本为您的数据库提供了一个免费的json接口。
将spods.py复制到要在其中使用它的目录。
使用以下方法包括它:
``python
>;
类。
首先,创建一组"field"对象并将它们存储在"table"中:
``python
>;>fields=[
…字段('id',int,pk=true),
…字段('title',str),
…字段('isbn',int),
…字段('condition',bool)
…]
…
>;>;book s\u table=table('book',fields)
````
现在是将表链接到数据库并开始创建对象的时候了。为此,只需连接到数据库并调用"create_linked_class(table,connection)"函数:
``python
>;>import sqlite3
>;>con=sqlite3.connect("database.db")
>;
恭喜!您刚刚在"database.db"中创建了一个数据库,并准备开始在其中存储"book"。如果books表不存在,spods将自动为您创建该表。
您可以运行如下命令:
``python
>;>book=book()
>;>book
{id:1,'title':none,'isbn':none,'condition':none}
````
还可以通过提供现有book对象的id来访问该对象:
`` python
>;>>book.title='笔记本'
>;>book.title
'笔记本'
>;>现有book=book(id=1)
>;>现有book
{id:1,'title':'the notebook','isbn':none,'condition':none}
````
>您也可以通过不指定id来创建新对象:
``python
>;book=book(title='atlas')
>;book.title
"atlas"
````
``使用spods对象
可以对属性使用所有常用的getter和setter方法,例如:
`` python
>;>x.id=7
>;x.id
7
```
>以及类似字典的访问:
``python
>;>x['id']=7
>;>x['id']
7
```
x[字段]=7
>;>;x.id
7
````
x['id']==none
true
```
>或者,等价地:
``python
>;>;x.id=5
>;>;del x.id
>;>;x.id==none
`true
```
只需删除它的主键:
`` python
>;>>del x.id;del x
```
**警告:**不要删除项目的主键后尝试访问该项目。最安全的做法是直接删除对象!
与数据库同步
所有*更新*、*插入*和*删除*将自动与数据库同步。所以别担心!
如果出于某种原因,您需要确保行已同步,则可以手动调用同步函数:
``python
>;>x.read廑sync();从数据库中读取所有值,替换x的本地副本
>;>x.write廑sync();将所有值写入数据库,替换数据库的值
```
要建立一对多关系,请使用以下语法:
``python
>;>;book.has-one(author)
``
一个新列。
现在,您可以使用主键将两个对象关联起来:
``python
>;>book=book(title='harry potter')
>;>author=author(name='j k rowling')
>;
>;b.作者id=1
````
…通过第一个访问相关对象!
``python
>;>book['author'].name
'j k rowling'
>;>book['author'].id
1
````
**注意:spods的当前版本不支持对关系的属性访问(例如上面示例中的"b.author")。我们正在努力解决这个问题,但目前只支持字典访问(例如"b['author']`)。*
\json api
现在是您想要使用spod的真正原因。spods附带了一个非常简单的自动生成的json api,可以在任何web应用程序中使用。
作者)
>;>result
…
```
`serve_api`将读取请求访问api的用户的cookies和表单数据,并返回要打印到网页的字符串。
<;!--api将返回"200 ok"、"400 bad request"或"401 unauthorized"响应代码。-->;
json结果包含3个字段:
*`status`,成功时为0,失败时为非零(一般错误为正,授权/权限错误为负)
*`error`,其中包含描述错误的错误消息
*`data`,其中包含受请求影响的对象(字典格式)
*例如`[{"id":2,"title":"正义得到伸张","author_id":1},{"id":3,"title":"地球上最美好的一天","author_id":2}`
api请求的格式如下:
(`{}"括号表示一个参数,`()`方括号表示默认值,`[]`方括号表示可选值:
```
http://www.yourdomain.com/api.py?
obj={<;table_u name>;}
[&;action={(view)add edit delete}]
[&;field>;={<;value>;}]
if action!=添加:
[&fetch={(all)one}
如果fetch=all:
[&;start={(0)number>;=0}]
[&;limit={(<;max_limit>;number>;=0}]
```
所有保留请求值(除了`<;`'s中的值外)都区分大小写-**in**。表名、字段名和字段值区分大小写。
把所有叫做"绿野仙踪"的书改名为"绿野女巫",你可以使用:
```
http://www.yourdomain.com/api.py?
obj=books
&fetch=one
&action=edit
&;*name='the wizard of oz'
&name='the witch of oz'
````
任何一个:
```
&;*name*='绿野仙踪'
&;**name**='绿野仙踪'
&;***name**='绿野仙踪'
```
你可以使用:
```
http://www.yourdomain.com/api.py?
obj=books
&fetch=one
&action=delete
&name='the wizard of oz'
````
obj=books
&fetch=all
&action=view
&author\u id=7
````
obj=books
&author\u id=7
````
注意:
*post数据也被接受,而不仅仅是get data
*事实上,任何cgi数据,一般来说,接受
*忽略未识别的参数
{
数据类型:'json',
数据:{
obj:'books',//我们想要得到的东西
fetch:'all',//我们想要多少
操作:'view',//what we want to do with them
///过滤参数
作者ID:7
},
成功:函数(json){
如果(json.status==0){
/成功!用json做一些事情
$。每个(json.data,函数(i,e){
alert("book"+i+"被称为"+e.title+");
});
}其他{
///错误:应用程序方面出了问题
//查看"error"字段以获取详细信息
alert("error:"+json.error);
}
},
error:function(){
///共有问题:连接问题,等等
alert("出现严重错误!");
}
};
````
我们需要的是一个可定制的接口,它允许各种扩展,并且不会破坏内部。幸运的是,spods在处理定制方面非常出色。
或者,您可能希望编写自己的api函数,这些函数仍然可以访问数据,但可以执行自定义操作。为此,您可以使用**自定义API函数**。
这很简单。首先,定义函数:
`` python
>;>>def credit_checksum(**kw):
…如果"信用卡"不是kw或不是kw["信用卡"].isDigit():
…引发异常("请输入有效的信用卡号码。")
…贷方金额=0
…对于kw中的数字[信用卡]:
…贷方金额+=整数(数字)
…返回{'sum':credit\u sum}
…
``
(注意函数如何获取*关键字参数`**kw`*,并返回*可序列化的python对象*。这对于json转换很重要。)
`**kw`*参数是CGI输入数据(如URL)。还有一些特殊的值:
*`''u cookie'`是来自用户的cookie对象(如果它不是空的话将被发送回用户)
*`''u classes'`是传递到'serve api()`
*的所有类对象的列表,例如,要检查您的api是否提供"person"对象,您可以检查"if person in kw['''u classes']`
*另一个很好的用法是不通过api提供特定对象,并通过自定义函数强制访问该对象,例如,提供对"user"对象(可能包含密码等)的默认api访问可能会带来安全风险
现在,在注册api时,只需传入函数(以及您希望响应的任何类):
``python
>;result=spods.serve_api(book,author,credit_checksum)
>;
…
````
obj=信用卡校验和
&credit卡=123492384342
`````
,响应如下:
``json
{"status":0,"error":","data":{"sum":45}
```
##就是这样!
您现在知道了所有关于spod的知识,并将其集成到您的应用程序中。
-)