无法访问Django REST vi

2024-04-20 11:13:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我读了一些关于Django Rest框架的文章,但是发现很难实现。有一个页面叫做“高分.html在加载时,应该向RESTful服务发出GET请求。返回该用户的高分列表。相关代码如下:

你知道吗视图.py地址:

from gamestore.serializers import ScoreSerializer
from rest_framework.decorators import api_view
from rest_framework.response import Response

。。你知道吗

# display high scores
@api_view(['GET'])
def highscores(request, id):

        print("INSIDE HIGH SCORES")
        userobj = request.user
        gameobj = Games.objects.get(pk=id)
        scoreobj = Scores.objects.filter(game=gameobj, player=userobj)

        if request.method == 'GET':
                #print(scoreobj[0].game)
                serializer = ScoreSerializer(scoreobj)
                return Response(serializer.data, template_name='gamestore/highscores.html')

你知道吗型号.py地址:

from django.contrib.auth.models import User
from django.db import models

class Usertypes(models.Model):
        user = models.OneToOneField(User)
        usertype = models.TextField()

        def __unicode__(self):
                return self.user_name

class Games(models.Model):
        name = models.CharField(max_length=100,unique=True)
        category = models.CharField(max_length=100)
        url = models.URLField()
        developer = models.ForeignKey(User)
        price = models.FloatField()

        def __unicode__(self):
                return self.name

class Scores(models.Model):
        game = models.ForeignKey(Games)
        player = models.ForeignKey(User)
        registration_date = models.DateField(auto_now=False, auto_now_add=False)
        gamestate = models.TextField(blank=True, null=True)
        high_score_1 = models.PositiveIntegerField(default=0)
        high_score_2 = models.PositiveIntegerField(default=0)
        high_score_3 = models.PositiveIntegerField(default=0)
        high_score_4 = models.PositiveIntegerField(default=0)
        high_score_5 = models.PositiveIntegerField(default=0)
        last_score = models.PositiveIntegerField(default=0)


        def __unicode__(self):
                return self.game

你知道吗序列化程序.py地址:

from rest_framework import serializers
from gamestore.models import Scores

    class ScoreSerializer(serializers.ModelSerializer):

            class Meta:
                    model = Scores
                    fields = ('game', 'player', 'high_score_1', 'high_score_2', 'high_score_3', 'high_score_4', 'high_score_5')

你知道吗高分.html地址:

$(document).ready(function(){
        var game = $(this);
        var id = document.getElementById("gameid").value;
        alert(id);
        var csrftoken = getCookie('csrftoken');
        $.ajax({
             type : "GET",
             url : "/highscores/",
             data : {'id': id},
             dataType : "json",
             success : function(data){
             console.log(data);
        }
        });
         event.preventDefault();

})

事实上,我完全被整个话题搞糊涂了,不知道如何用“高分”的观点来表达答案高分.html文件。当我在服务器上运行这个时,我得到一个404notfound错误。“highscores”视图显然甚至没有被访问,因为“insidehighscores”行没有显示在服务器中。作为一个教程,我遵循了这篇文章https://realpython.com/blog/python/django-rest-framework-quick-start/#drf-setup,它看起来很简单,但是我不了解很多东西,比如呈现输出,它的格式(例如JSON)等等。有人能帮忙吗?即使是一个链接到一个易于理解的初学者文件将是有用的。提前谢谢!你知道吗

编辑:

你知道吗网址.py地址:

from django.conf.urls import patterns, include, url
from django.contrib import admin
import gamestore.views

urlpatterns = patterns('',
        # Examples:
        # url(r'^$', 'wsdProject.views.home', name='home'),
        # url(r'^blog/', include('blog.urls')),

        url(r'^admin/', include(admin.site.urls)),
        url(r'^$','gamestore.views.home'),
        url(r'^login/','gamestore.views.login_view'),
        url(r'^logout/','gamestore.views.logout_view'),
        url(r'^registration/','gamestore.views.registration'),
        url(r'^addgame/','gamestore.views.addgame'),
        url(r'^devhome/','gamestore.views.devhome'),
        url(r'^gamestats/','gamestore.views.gamestats'),
        url(r'^savegamestate/','gamestore.views.savegamestate'),
        url(r'^loadgamestate/','gamestore.views.loadgamestate'),
        url(r'^editgame/(?P<id>\d+)/','gamestore.views.editgame'),
        url(r'^delete/(?P<id>\d+)/','gamestore.views.deletegame'),
        url(r'^loadgame/(?P<id>\d+)/','gamestore.views.loadgame'),
        url(r'^loadhighscores/(?P<id>\d+)/','gamestore.views.loadhighscores'),
        url(r'^highscores/(?P<id>\d+)/','gamestore.views.highscores'),
        url(r'^gamestore/', include('gamestore.urls', namespace="gamestore")),
        url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
)

Tags: fromimportselfrestidgameurlmodels
1条回答
网友
1楼 · 发布于 2024-04-20 11:13:48

好吧,你有这个url规则url(r'^highscores/(?P<id>\d+)/'。你知道吗

因此,在ajax调用中,您的url只是"/highscores/",您使用GET参数发送id,因此您的最终url看起来像"/highscores/?id=some_id",这是错误的。你的网址应该是这样的"/highscores/some_id"。您需要附加id。"/highscores/"+id

$(document).ready(function(){
                                var game = $(this);
                                var id = document.getElementById("gameid").value;
                                alert(id);
                                var csrftoken = getCookie('csrftoken');
                                $.ajax({
                                        type : "GET",
                                        url : "/highscores/"+id,

                                        dataType : "json",
                                        success : function(data){
                                                console.log(data);
                                        }
                                });
                                event.preventDefault();
                        });

另外,在您的视图中,您正在发送一个html模板作为响应,它应该是JSON响应。只需删除template_name参数。你知道吗

return Response(serializer.data)

相关问题 更多 >