首页 > 解决方案 > 错误:运行服务器后找不到页面(404)

问题描述

我有一个 django 应用程序,但我想制作它的 API,所以我在运行服务器后创建了它

找不到页面 (404)

但是我的 django 应用程序正在运行,在运行 API 的 url 后,我得到了 Page not found 的错误

列表/views.py

from django.http import Http404
from django.shortcuts import render
from django.views.generic import ListView,DetailView
from .models import List
from django.http import HttpResponse,JsonResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser
from List.serializers import ListSerializers




class MainListView(ListView):
   queryset = List.objects.all()
   # temp     = List.objects.all()
   template_name = "main_list.html"


   def get_context_data(self, *args, **kwargs):
       context = super(MainListView, self).get_context_data(*args, **kwargs)
       context['temp'] =  List.objects.all() 
       return context


class MainListView(ListView):
   queryset = List.objects.all()
   # temp     = List.objects.all()
   template_name = "List/list.html"


   def get_context_data(self, *args, **kwargs):
       context = super(MainListView, self).get_context_data(*args, **kwargs)
       context['temp'] =  List.objects.all() 
       return context
class MainDetailSlugView(DetailView):
      queryset = List.objects.all()
      template_name = "news/detail.html"



@csrf_exempt
def head_list(request):

    if request.method == 'GET':
       queryset = List.objects.all()
       serializer = ListSerializer(queryset, many=True)
       return JsonResponse(serializer.data, safe=False)

elif request.method == 'POST':
    data = JSONParser().parse(request)
    serializer = ListSerializer(data=data)
    if serializer.is_valid():
        serializer.save()
        return JsonResponse(serializer.data, status=201)
    return JsonResponse(serializer.errors, status=400)


@csrf_exempt
def head_detail(request, pk):


    try:

        head = List.objects.get(pk=pk)
        except List.DoesNotExist:
            return HttpResponse(status=404)


    if request.method == 'GET':
        serializer = ListSerializer(list)
        return JsonResponse(serializer.data)

    elif request.method == 'PUT':
        data = JSONParser().parse(request)
        serializer = SnippetSerializer(head, data=data)
        if serializer.is_valid():
           serializer.save()
           return JsonResponse(serializer.data)
        return JsonResponse(serializer.errors, status=400)



    elif request.method == 'DELETE':
         head.delete()
         return HttpResponse(status=204)

列表/urls.py

from django.urls import path

from List import views

from .views import(
     # ListlistView,
     MainListView,
     MainDetailSlugView,
     head_list,
     head_detail

 )

 urlpatterns = [
     # url(r'^$',ListlistView.as_view()),
     path('',MainListView.as_view(),name='list'),

     path('(<pk>\d+)(?:/(<slug>[\w\d-]+))',MainDetailSlugView.as_view(), name='List'),
     path('list/',views.list_list),
     path('lists/<int:pk>/',views.list_detail),
 ]

列表/序列化器.py

from rest_framework import serializers
from List.models import List




class ListSerializers(serializers.Serializer):
   id = serializers.IntegerField(read_only=True)
   title      = serializers.CharField(required=True, allow_blank=False,max_length=120)
   slug       = serializers.SlugField(required=False,)
   description= serializers.CharField(required=True, allow_blank=False)
   image      = serializers.ImageField(required=True,)

   timestamp  = serializers.DateTimeField(required=True,)
   code = serializers.CharField(style={'base_template': 'textarea.html'})
   language = serializers.CharField(default='python')
   style = serializers.CharField(default='friendly')



   def create(self, validated_data):
       return List.objects.create(**validated_data)


    def update(self, instance, validated_data):


        instance.title = validated_data.get('title', instance.title)
        instance.descritption = validated_data.get('descritption', instance.descritption)
        instance.image = validated_data.get('image', instance.image)
        instance.timestamp = validated_data.get('timestamp',instance.timestamp)
        instance.language = validated_data.get('language',instance.language)
        instance.style = validated_data.get('style',)

        instance.save()
        return instance

列表/models.py

import random
import os

from django.db import models
from django.urls import reverse
from django.db.models.signals import pre_save, post_save
from lokswar.utils import unique_slug_generator
from pygments.lexers import get_all_lexers
from pygments.styles import get_all_styles



LEXERS = [item for item in get_all_lexers() if item[1]]
LANGUAGE_CHOICES = sorted([(item[1][0],item[0]) for item in LEXERS])
STYLE_CHOICES = sorted((item,item) for item in get_all_styles())



def get_filename_ext(filepath):
    base_name = os.path.basename(filepath)
    name, ext = os.path.splitext(base_name)
    return name,ext

def upload_image_path(instence, filename):
    new_filename = random.randint(1,396548799)
    name, ext = get_filename_ext(filename)
    final_filename = '{new_filename}{ext}'.format(new_filename=new_filename, ext= ext)
    return "card/{new_filename}/{final_filename}".format(new_filename=new_filename,
    final_filename=final_filename)
class ListQuerySet(models.query.QuerySet):
   def active(self):
       return self.filter(active=True)




class ListManager(models.Manager):
   def get_queryset(self):
       return ListQuerySet(self.model, using=self._db)
   def all(self):
       return self.get_queryset().active()





class List(models.Model):
   created = models.DateTimeField(auto_now_add=True)
   title      = models.CharField(max_length=120)
   slug       = models.SlugField(blank=True, unique=True)
   description= models.TextField()
   image      = models.ImageField(upload_to=upload_image_path,null=True, blank=True)
   active     = models.BooleanField(default=True)
   timestamp  = models.DateTimeField(auto_now_add=True)
   code = models.TextField(default=True)
   language = models.CharField(choices=LANGUAGE_CHOICES, default='python', max_length=100)
   style = models.CharField(choices=STYLE_CHOICES, default='friendly', max_length=100)


   objects = ListManager()

   class Meta:
    ordering = ('created',)
   def get_absolute_url(self):
       return reverse('List', kwargs={'pk': self.pk, 'slug': self.slug })
   def __str__(self):
       return self.title
   def __unicode__(self):
       return self.title

请帮我解决这个错误。我正在尝试通过此 url 运行我的 APIhttp://127.0.0.1:8000/List/list/

网址.py

from django.contrib import admin
from django.urls import path,include
from django.conf import settings
from django.conf.urls.static import static


from .views import HomeListView

urlpatterns = [
     path('List',include('List.urls'), name="List"),
     path('news/',include('news.urls'), name="news"),
     path('', HomeListView.as_view(), name='home'),
     path('sports/',include('sports.urls'), name="sports"),
     path('movie/',include('movie.urls'), name="movie"),
     path('business/',include('business.urls'), name="business"),
     path('api-auth/', include('rest_framework.urls')),
     path('admin/', admin.site.urls),
]

标签: djangodjango-rest-framework

解决方案


 urlpatterns = [
     path('',MainListView.as_view(),name='list'),
     path('(<pk>\d+)(?:/(<slug>[\w\d-]+))',MainDetailSlugView.as_view(), name='List'),
     path('list/',views.list_list),
     path('lists/<int:pk>/',views.list_detail),
]

正如您在上面看到的,您定义了两个适用于此处的 url

/list/
/lists/<int>  # which applies to something like /lists/293749

您的 URL 调用 is /List/list,这不适用于此处的任何 URL,除非您使用类似的东西定义项目级 URLs.py

urlpatterns = [
   path('list/', include('List.urls'))
]

几件事:

  • 看看python约定。类是大写的和 PascalCase,而变量、方法和函数是snake_case。没有理由让模块大写
  • 不要使用与 python/django 内置函数和保留字相同的名称。这会导致问题,并且是养成的好习惯。
  • 我相信 django在 URL 解析器中将url 视为区分大小写。你打电话/List,但网址定义是/list

推荐阅读