python、django和pyamf
最近是学了有关用pyamf来连接python和django的东东,所以把自己的一些学习的步骤与体会记下来。环境:python-2.7 django-1.5 pyamf-0.6
第一部分:先建立一个admin,这个就按照<<djangobook2.0>>的步骤来做好了.
建好的工程和app
新建一个数据库onetest,我用的是postgresql数据库
把数据库设置一下在setting中
然后也是在setting中添加app:
在url.py中
models中
1 # encoding=utf-8 2 from django.db import models 3 4 5 #定义出版商 6 class Publisher(models.Model): 7 #主键,id自增 8 id=models.AutoField(primary_key=True) 9 #名字 10 publisher_name = models.CharField( max_length=30 ,verbose_name = "名字") 11 #地址 12 publisher_address = models.CharField( max_length=50,verbose_name = "地址") 13 #email 14 psublisher_email = models.EmailField(blank=True) 15 #禁用 16 enable = models.IntegerField(default=0,blank=True,verbose_name = "禁用") 17 18 def __unicode__(self): 19 return self.publisher_name 20 21 class Meta: 22 verbose_name = "出版商" 23 verbose_name_plural = "出版商" 24 25 26 #定义作者 27 class Author(models.Model): 28 #主键,id自增 29 id=models.AutoField(primary_key=True) 30 #名字 31 author_name = models.CharField(max_length=30 ,verbose_name = "名字") 32 #地址 33 author_address = models.CharField(max_length=50,verbose_name = "地址" ) 34 #email 35 author_email = models.EmailField(blank=True) 36 #禁用 37 enable = models.IntegerField(default=0,blank=True,verbose_name = "禁用") 38 39 def __unicode__(self): 40 return self.author_name 41 42 class Meta(): 43 verbose_name = "作者" 44 verbose_name_plural = "作者" 45 46 47 #定义书本 48 class Book(models.Model): 49 #主键,id自增 50 id=models.AutoField(primary_key=True) 51 #名字 52 book_name = models.CharField( max_length=30 ,verbose_name = "书名") 53 #书作者 54 books_author = models.ManyToManyField(Author, related_name="book_author_r") 55 #书出版商 56 book_publisher = models.ForeignKey(Publisher,related_name="book_publisher_r") 57 #禁用 58 enable = models.IntegerField(default=0,blank=True,verbose_name = "禁用") 59 60 def __unicode__(self): 61 return self.book_name 62 63 class Meta(): 64 verbose_name = "书本" 65 verbose_name_plural = "书本"
在testapp中新建一个admin.py文件
1 # encoding=utf-8 2 from django.contrib import admin 3 from models import * 4 5 admin.site.register(Book) 6 admin.site.register(Author) 7 admin.site.register(Publisher)
在命令行输入manage.py syncdb
浏览器:(中文显示可以在setting里的LANGUAGE_CODE=‘en-us’换为'zh-CN')
在testapp下建立gateway.py和publisher_action.py
publisher_action.py:
1 #encoding=utf-8 2 from django.db import transaction 3 from django.conf import settings 4 import models 5 6 import logging 7 8 9 10 infoLog = logging.getLogger("info") 11 errorLog = logging.getLogger("error") 12 debugLog = logging.getLogger("debug") 13 14 ''' 15 接口 16 "publisher_name"=publisher_name, 17 "publisher_address"=publisher_address, 18 "publisher_email"=publisher_email, 19 "enable"=enable, 20 ''' 21 22 #新增publisher 23 def insert(data = {}): 24 try: 25 model = models.Publisher(publisher_name=data.get("publisher_name"), publisher_address=data.get("publisher_address"), publisher_email=data.get("publisher_email"),enable=data.get("enable")) 26 if model.enable == None: 27 model.enable=0 28 model.save() 29 return model.id 30 except Exception,e: 31 errorLog.error(e.message) 32 return e 33 34 #修改Publisher 35 def update(data = {}): 36 try: 37 try: 38 model = models.Publisher.objects.get(id=data.get("id")) 39 except Exception,ge: 40 errorLog.error(ge.message) 41 return 0 42 model.publisher_name=data.get("publisher_name") 43 model.publisher_address=data.get("publisher_address") 44 model.publisher_email=data.get("publisher_email") 45 model.enable=data.get("enable") 46 if model.enable == None: 47 model.enable=0 48 model.save() 49 return model.id 50 except Exception,e: 51 errorLog.error(e.message) 52 return None 53 54 #删除Publisher 55 @transaction.commit_manually 56 def delete(datas = []): 57 try: 58 transaction.savepoint() 59 try: 60 for data in datas: 61 model = models.Publisher.objects.get(id=data.get("id")) 62 model.delete() 63 transaction.commit() 64 return len(datas) 65 except Exception,de: 66 transaction.rollback() 67 errorLog.error(de.message) 68 return 0 69 return True 70 except Exception,e: 71 errorLog.error(e.message) 72 return None
gateway:
1 #encoding=utf-8 2 from pyamf.remoting.gateway.django import DjangoGateway 3 import publisher_action 4 import book_action 5 6 7 services = { 8 "publisher_action.insert":publisher_action.insert, 9 "publisher_action.update":publisher_action.update, 10 "publisher_action.delete":publisher_action.delete, 11 12 } 13 14 recGW = DjangoGateway(services, expose_request=False, debug=True) 15 recGW.timezone_offset = 8 * 60 * 60
测试testing:
1 # encoding=utf-8 2 import logging 3 4 logging.basicConfig( 5 level=logging.DEBUG, 6 format='%(asctime)s %(levelname)-5.5s [%(name)s] %(message)s' 7 ) 8 9 from pyamf.remoting.client import RemotingService 10 11 url = 'http://127.0.0.1:8000/gateway/' 12 gw = RemotingService(url, logger=logging) 13 service = gw.getService('publisher_action') 14 15 def insert(): 16 print service.insert({"publisher_name":"xx","publisher_address":"xx","publisher_email":"123@123.com","enable":"0"}) 17 18 insert()
运行testing就可以在admin中的publisher看到新增的字段。
在testapp中新建一个book_action:
1 # encoding=utf-8 2 from django.db import transaction 3 from django.conf import settings 4 import models 5 from models import Author 6 from models import Book 7 from models import Publisher 8 9 import logging 10 11 infoLog = logging.getLogger("info") 12 errorLog = logging.getLogger("error") 13 debugLog = logging.getLogger("debug") 14 15 ''' 16 接口 17 "book_name"=book_name, 18 "books_author"=books_author, 19 "book_publisher"=book_publisher, 20 "enable"=enable, 21 ''' 22 23 #新增publisher 24 def insert(data = {}): 25 try: 26 model = models.Book( book_name=data.get("book_name"),book_publisher_id=data.get("book_publisher_id"),enable=data.get("enable")) 27 if model.enable == None: 28 model.enable=0 29 model.save() 30 31 a = Author.objects.get(id=data.get("books_author_id_1")) 32 c = Author.objects.get(id=data.get("books_author_id_2")) 33 b = Book.objects.get(id = model.id) 34 b.books_author.add(a) 35 b.books_author.add(c) 36 37 return model.id 38 except Exception,e: 39 errorLog.error(e.message) 40 return e
testing修改为:
1 # encoding=utf-8 2 import logging 3 4 logging.basicConfig( 5 level=logging.DEBUG, 6 format='%(asctime)s %(levelname)-5.5s [%(name)s] %(message)s' 7 ) 8 9 from pyamf.remoting.client import RemotingService 10 11 url = 'http://127.0.0.1:8000/gateway/' 12 gw = RemotingService(url, logger=logging) 13 service = gw.getService('book_action') 14 15 def insert(): 16 print service.insert({"book_name":"xx","book_publisher_id":"1","books_author_id_1":"3","books_author_id_2":"4","enable":"0"}) 17 18 insert()
运行testing,这样就可以看到新增的book字段与author有多对多的关系。可能页面会出现bug,重开浏览器就不会了。