Oct*_*box 11 python django tastypie
我目前正致力于在我的Django项目中实现API,而Tastypie似乎最适合.
我似乎无法解决的是如何使用Tastypie在我的模型中公开一个函数.
例如,我有这个模型:
class game(models.Model):
id = models.AutoField("ID", primary_key=True, editable=False)
ip_address = models.OneToOneField(IPAddress, verbose_name="IP Address")
port = models.CharField("Port", max_length=5)
name = models.CharField("Game Name", max_length=100)
ram = models.IntegerField("RAM (mb)", max_length=10)
node = models.ForeignKey(node)
user = models.ForeignKey(User)
config = models.ForeignKey(Config)
mysqlserver = models.ForeignKey(MySQLserver)
mysqlenabled = models.BooleanField("MySQL Created?")
suspended = models.BooleanField("Suspended")
Run Code Online (Sandbox Code Playgroud)
在这个模型中,我有这样的功能:
def start(self):
config = Config.objects.get(pk=self.config.id)
cmds = config.startcmds
game = config.gametype
parsedcmds = self.replace_variables(cmds)
client = phPanel.jelly.jelly.zmqclient(self.ip_address.address)
data = {'user':self.generate_username(), 'method':'start_server', 'id':self.id, 'memory':self.ram, 'ip':self.ip_address.address,
'port':self.port, 'startcmds':parsedcmds, 'game':game}
result = client.send(data)
return result
Run Code Online (Sandbox Code Playgroud)
我想通过使用tastypie的API公开.
我查看了文档和食谱,但我似乎无法找到我要找的东西.
任何帮助,将不胜感激 :)
ign*_*aga 21
在您的Game-Resource中,您始终可以预先添加可以公开方法的新URL.例如(根据@BigglesZX的评论编辑):
from tastypie.resources import ModelResource
from tastypie.utils import trailing_slash
class GameResource(ModelResource):
class Meta:
queryset = Game.objects.all()
resource_name = 'store'
def prepend_urls(self):
""" Add the following array of urls to the GameResource base urls """
return [
url(r"^(?P<resource_name>%s)/(?P<pk>\w[\w/-]*)/start%s$" %
(self._meta.resource_name, trailing_slash()),
self.wrap_view('start'), name="api_game_start"),
]
def start(self, request, **kwargs):
""" proxy for the game.start method """
# you can do a method check to avoid bad requests
self.method_check(request, allowed=['get'])
# create a basic bundle object for self.get_cached_obj_get.
basic_bundle = self.build_bundle(request=request)
# using the primary key defined in the url, obtain the game
game = self.cached_obj_get(
bundle=basic_bundle,
**self.remove_api_resource_names(kwargs))
# Return what the method output, tastypie will handle the serialization
return self.create_response(request, game.start())
Run Code Online (Sandbox Code Playgroud)
所以现在你可以使用以下uri"/ game/[pk]/start /"来调用这个方法.所以"/ game/1/start /"会调用pk = 1的游戏开始方法
归档时间: |
|
查看次数: |
2883 次 |
最近记录: |