我正在使用RESTlet,我已经创建了一个资源.我通过重写acceptRepresentation方法来处理POST.
客户端应该向我发送一些数据,然后将其存储到DB,将响应设置为201(SUCCESS_CREATED)并且我需要将一些数据返回给客户端,但是返回类型的acceptRepresentation是无效的.
在我的情况下,我需要返回一些识别器,以便客户端可以访问该资源.
例如,如果我有一个带有URL /资源的资源,并且客户端发送POST请求,我在DB中添加新行,其地址应为/ resource/{id}.我需要发送{id}.
难道我做错了什么?REST原则是否允许在POST后返回一些内容?如果是的话,我怎么能这样做,如果没有办法处理这种情况呢?
我有Tornado用作http服务器和自定义http框架的设置.想法是拥有单个龙卷风处理程序,并且每个到达的请求都应该只是提交给ThreadPoolExecutor并留下Tornado来监听新的请求.一旦线程完成处理请求,就会调用回调,该回调会在执行IO循环的同一线程中向客户端发送响应.
剥离,代码看起来像这样.基本http服务器类:
class HttpServer():
def __init__(self, router, port, max_workers):
self.router = router
self.port = port
self.max_workers = max_workers
def run(self):
raise NotImplementedError()
Run Code Online (Sandbox Code Playgroud)
Tornado支持HttpServer的实现:
class TornadoServer(HttpServer):
def run(self):
executor = futures.ThreadPoolExecutor(max_workers=self.max_workers)
def submit(callback, **kwargs):
future = executor.submit(Request(**kwargs))
future.add_done_callback(callback)
return future
application = web.Application([
(r'(.*)', MainHandler, {
'submit': submit,
'router': self.router
})
])
application.listen(self.port)
ioloop.IOLoop.instance().start()
Run Code Online (Sandbox Code Playgroud)
处理所有龙卷风请求的主处理程序(仅实现GET,但其他请求相同):
class MainHandler():
def initialize(self, submit, router):
self.submit = submit
self.router = router
def worker(self, request):
responder, kwargs = self.router.resolve(request)
response …Run Code Online (Sandbox Code Playgroud) 我有一个学校项目,我必须使用Java.最近我找到了play框架,我想尝试使用它.这很容易快速启动,但我遇到了会话问题.
就其本质而言是无状态的,play会在cookie中将整个会话发送给用户并在下一个请求时接收它,因此它只允许会话中有限的数据量.
我想要做的是在用户登录时从数据库中获取User对象,并将其保存在会话中,这样我就可以从模板中访问它等等(我在User类中有一些方法需要调用以便自定义UI ),但如果我放置User对象,则调用其toString方法并将其放入会话中.
我发现推荐的方法是将大量数据放入Cache中,但我不知道如何从模板中访问它(我想我可以用@Before注释创建方法并将用户添加到renderArgs,但这似乎不太给我干净)另一个问题是Cache的生命周期有限,所以我的对象可能会消失.
有没有人有这种问题的经验?
有没有办法使用服务器端会话?我不需要这个项目的REST功能,因此,就我而言,应用程序可以保存状态...
是否可以从我的程序访问Firefox信息?具体来说,我需要在活动标签中读取已打开网站的URL.这样的事情可能吗?
我想我可以写扩展,这将允许我做这样的事情,但我想知道它是否有一些FF api ...
我有一个包含多个存储库的目录,它看起来像这样:
folder
|- repo1
| |- .git
| |- File1.txt
|- repo2
| |- .git
| |- File2.txt
|- repo3
| |- .git
| |- File3
Run Code Online (Sandbox Code Playgroud)
我想将它们组合成单个git存储库,我按照这些说明进行了操作.
在这些指令之后,我有以下结构:
folder
|- .git
|- repo1
| |- File1.txt
|- repo2
| |- File2.txt
|- repo3
| |- File3
Run Code Online (Sandbox Code Playgroud)
这很棒.但是现在我有主分支(来自repo1)和历史上的两个孤儿分支:
* Merge repo3
|\
| * Add third file
* Merge repo2
|\
| * Add second file
* Add first file
Run Code Online (Sandbox Code Playgroud)
我想得到的是这样的
* Merge repo 3
* Add third file …Run Code Online (Sandbox Code Playgroud) 我找到了一些关于大O表示法的参考文献,但据我所知,算法复杂度是输入数据大小的函数.
例如,如果气泡的复杂性排序是O(n^2),n被输入数组的大小.对?
但是,我如何确定具有固定输入大小并取决于输入值的算法的复杂性.例如,找到最大公约数(GCD)将如下所示:
def GCD(x, y):
while x != y:
if x < y:
x, y = y - x, x
else:
x, y = x - y, x
return x
Run Code Online (Sandbox Code Playgroud)
这个算法的复杂性是什么?它是如何确定的?
编辑:更改了函数的名称和更正的算法名称.ShreevatsaR,谢谢你的指出.
我正在创建表达式树,有一种情况我需要在另一个lambda中创建一个lambda并将一个lambda存储在一个类中并在表达式树中添加该类.这是我想要做的简单示例(此代码无法编译):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Expressions;
namespace SimpleTest {
public class LambdaWrapper {
private Delegate compiledLambda;
public LambdaWrapper(Delegate compiledLambda) {
this.compiledLambda = compiledLambda;
}
public dynamic Execute() {
return compiledLambda.DynamicInvoke();
}
}
public class ForSO {
public ParameterExpression Param;
public LambdaExpression GetOuterLambda() {
IList<Expression> lambdaBody = new List<Expression>();
Param = Expression.Parameter(typeof(object), "Param");
lambdaBody.Add(Expression.Assign(
Param,
Expression.Constant("Value of 'param' valiable"))
);
lambdaBody.Add(Expression.Call(
null,
typeof(ForSO).GetMethod("Write"),
Param)
);
Delegate compiledInnerLambda = GetInnerLambda().Compile();
LambdaWrapper wrapper = new LambdaWrapper(compiledInnerLambda);
lambdaBody.Add(Expression.Constant(wrapper));
//lambdaBody.Add(GetInnerLambda()); …Run Code Online (Sandbox Code Playgroud) 这是模型:
class Car(models.Model):
user = models.ForeignKey(User, related_name='cars')
name = models.CharField(max_length=64)
Run Code Online (Sandbox Code Playgroud)
网址模式如下所示:
url(r'^car/(?P<pk>\d+)/$', login_required(CarDetails.as_view()), name='car_details)
Run Code Online (Sandbox Code Playgroud)
并查看:
class CarDetail(DetailView):
context_object_name = 'car'
template_name = 'my_app/car_details.html'
model = models.Car
def get_object(self, *args, **kwargs):
car = super(CarDetail, self).get_object(*args, **kwargs)
if car.user != self.request.user:
raise PermissionDenied()
else:
return car
Run Code Online (Sandbox Code Playgroud)
这很好用,但是在每个类中我都必须重写get_object以防止用户弄乱别人的对象。这包括对我拥有的每个模型进行编辑和删除,这严重违反了DRY原理。
有一个更好的方法吗?可能是login_required装饰器之类的东西?
编辑:
正如Dr.Tyrsa在他的回答中所提出的,解决方案或多或少简单,只有一点点不同。我创建的基类CurUserOnly继承object,而不是DetailView(我想使用这个类DeleteView和UpdateView,太),现在CarDetail继承CurUserOnly和DetailView,CarDelete继承CurUserOnly和DeleteView等等......
有趣的是,我之前曾尝试过此方法,但由于我忘了python的MRO,并且DetailView在CurUserOnly应该成为继承列表的第一位时,它没有起作用!
最后,这是CurUserOnly …
我有一种情况,当DB中的某些内容发生变化时,我需要通知某些用户.我的想法是抓住pre_save并post_save发出信号并制作某种差异和邮件.一般来说它运作良好,但我不知道如何获得m2m字段的差异.
目前我有这样的事情:
def pre_save(sender, **kwargs):
pk = kwargs['instance'].pk
instance = copy.deepcopy(sender.objects.get(pk=pk))
tracking[sender] = instance
def post_save(sender, **kwargs):
instance = copy.deepcopy(kwargs['instance'])
print diff(instance, (tracking[sender])) # TODO: don't print, save diff somewhere
Run Code Online (Sandbox Code Playgroud)
Diff函数应该适用于每个模型(在mommet我有四个模型类).使用深度复制,我可以保存旧模型,但我不知道如何保存m2m字段,因为它们在单独的表中(是的,我知道我可以获得这些数据,但在执行的时候我不知道哪些字段是m2m,我不想为每个型号创建不同的插槽).我想要的是通用解决方案,所以我可以稍后添加模型而不考虑通知部分.
我的计划是在调用插槽后调用get_data()并clear_data()运行save(),以清理插槽生成的差异.
这是这样做的好方法吗?有没有更好的办法?是否有能为我做这项工作的django应用程序?
请原谅我的英语,这不是我的母语.