我使用django作为REST服务构建Web应用程序,并在前面使用AJAX请求检索数据的jquery,然后使用自定义函数呈现此数据。主要目标 - 应用程序不应该刷新页面,只能刷新ajax。目前,django只呈现一个静态页面,而其他URL则使用JSON数据进行响应。
网址示例:
urlpatterns = [
url(r'^api/item/(?P<pk>\d+)/$', ItemView.as_view(), name='item'),
url(r'^', IndexView.as_view(), name='index'),
]
的观点:
class IndexView(View):
def get(self, request, pk):
return render(request, 'index.html')
class ItemView(View, ErrorMixin):
def get(self, request, pk):
try:
item = Item.objects.get(pk=pk)
return HttpResponse(json.dumps({'status': 'success', 'message': '', 'data': item.serialize()}))
except Item.DoesNotExist:
return HttpResponse(json.dumps({'status': 'error', 'message': 'invalid item id'}))
在前端,我使用html历史记录API在ajax调用后设置url。例如,对于http://example.com/api/item/1上的ajax调用,我会将浏览器网址设置为http://example.com/item/1。
我希望,用户可以共享此类链接,以便直接访问所需的项目,而且我不知道正确的方法,如何处理此类请求以及呈现所需的数据。
我认为有两种方法: 首先是解析前端的url,并进行ajax调用,取决于它是什么url。例如,如果url为http://example.com/item/1,我应该在http://example.com/api/item/1上进行ajax调用,并呈现返回的数据。
其次是在django视图中为get请求提供单独的逻辑:
def ItemView(View):
def get(self, request):
if request.is_ajax():
return HttpResponse(json.dumps({'status': 'success', 'message': '', 'data': item.serialize()}))
else:
return render(request, 'templates/item.html', {'data': item'})
我有点困惑。在我看来,第二种方法与REST API无关,因为我不应该在后端呈现包含数据的页面,只能使用JSON进行响应。此外,我将不得不创建更多的模板。
在第一种方法中,我将不得不在前端编写巨大的if-else逻辑,因为在url解析后,我需要调用正确的渲染函数,取决于api调用是什么。 请告知最佳方法
答案 0 :(得分:0)
如果您想在不重新加载页面的情况下更改网址而忘记服务器端,那么您的前端如何响应特定的API调用就成了问题。当您在浏览器中更改网址时(正好是window.location
),您基本上会告诉它新内容正在进入,这是在获取新网页内容时执行的(使用Django {{1}功能)并重新加载。
如果我理解正确,您只想获取JSON数据(就像您使用render()
一样),然后在页面上显示它而不重新加载。使用jQuery,您可以通过发送请求然后以特定方式显示其响应内容来完成此操作,例如更改页面上的元素内容:
HttpResponse()