TypeError: объект «NoneType» не подлежит подписке, за которой следует AttributeError: объект «NoneType» не имеет атрибута «split»

Использование джанго. У меня есть следующая модель:

class Postagem(models.Model):
id = models.AutoField(primary_key=True, editable=False)
descricao = models.CharField(max_length=50)
area = models.ForeignKey('core.Area', null=True)
user = models.ForeignKey('User')
categoria = models.CharField(max_length=50, null=True)
post = models.FileField(upload_to='posts/', null=True)
thumbnail = models.FileField(upload_to='posts/', null=True)


def __str__(self):
    return self.descricao

Следующая форма:

class PostForm(forms.ModelForm):
categoria = forms.ChoiceField(choices=[("Video","Vídeo"),("Audio","Aúdio"),("Imagem","Imagem"),("Musica","Música")], required=True)
thumbnail = forms.FileField(required=False)

class Meta:
    model = Postagem
    fields = ['descricao', 'area', 'user', 'post']

Вид:

def profileView(request):
context = getUserContext(request)

if request.method == 'POST':
    exception=None
    userDict = {}
    userDict["user"] = context["user"].id    
    if "categoria" in request.POST:
        newPost = request.POST.copy()
        newPost.update(userDict)
        form = PostForm(newPost,request.FILES)
        print("postform POST: ",newPost, " File ",request.FILES)
        if form.is_valid():
            print("valid")
            try:
                form.save()
                print("saved")
                return HttpResponseRedirect(reverse_lazy('accounts:profile'))
            except IntegrityError as e:
                print("Integrity Error")
                exception=e            
        else:
            print("PostForm error")
            print(form.errors)

    form.non_field_errors=form.errors
    if exception is not None:
        form.non_field_errors.update(exception)
    context['form']=form

posts = Postagem.objects.get_queryset().order_by('id')
paginator = Paginator(posts, 12)
page = request.GET.get('page')
context["areas"] = Area.objects.all()   
try:
    posts = paginator.page(page)
except PageNotAnInteger:
    # If page is not an integer, deliver first page.
    posts = paginator.page(1)
except EmptyPage:
    # If page is out of range (e.g. 9999), deliver last page of results.
    posts = paginator.page(paginator.num_pages)

context["posts"]=posts

return render(
    request,
    'accounts/profile.html',
    context
)

И наконец шаблон:

 {% for post in posts %}
        {% if forloop.counter0|divisibleby:4 or forloop.counter0 == 0 %}    
        <div id="grid-profile" class="row grid">
            <div class="col-md-1"></div>
        {% endif %}

            {% ifnotequal post.categoria "Imagem"%}
            <iframe id=post{{forloop.counter}} width="420" height="315"
                src={{post.post.url}}>
            </iframe>
            {% else %}
            <div class="col-md-2">
                <button type="button" id="modal1trigger" data-toggle="modal" data-target="#modal1"><img class="img-responsive" src={{post.post.url}}></img></button>
            </div>
            {% endifnotequal %}

        {% if forloop.counter|divisibleby:4 or forloop.counter == posts|length %} 
            <div class="col-md-1"></div>
        </div>
        {% endif %}
        {% endfor %}
        <div class="pagination">
            <span class="step-links">
                {% if posts.has_previous %}
                    <a href="?page={{ posts.previous_page_number }}">previous</a>
                {% endif %}

                <span class="current">
                    Page {{ posts.number }} of {{ posts.paginator.num_pages }}.
                </span>

                {% if posts.has_next %}
                    <a href="?page={{ posts.next_page_number }}">next</a>
                {% endif %} 
            </span>
        </div>

Я вырезал часть шаблона... В любом случае, я хочу иметь возможность добавлять все виды сообщений. Песни, видео, изображения, документы и т. д. И это работает. Посты добавляются. Но у меня повторяющаяся ошибка, и я не знаю, почему. Это может быть очень опасно, поэтому я начал изучать это, но не смог найти приемлемого ответа. Эта ошибка возникает только при попытке получить песню или видео.

    [21/Sep/2017 23:32:44] "GET /media/posts/13567830_1641362072853439_1924036772_n.mp4 HTTP/1.1" 200 1171456
Traceback (most recent call last):
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\wsgiref\handlers.py", line 138, in run
    self.finish_response()
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\wsgiref\handlers.py", line 180, in finish
_response
    self.write(data)
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\wsgiref\handlers.py", line 279, in write
    self._write(data)
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\wsgiref\handlers.py", line 453, in _write

    result = self.stdout.write(data)
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\socketserver.py", line 775, in write
    self._sock.sendall(b)
ConnectionResetError: [WinError 10054] Foi forçado o cancelamento de uma conexão existente pelo host remoto
[21/Sep/2017 23:32:44] "GET /media/posts/13567830_1641362072853439_1924036772_n.mp4 HTTP/1.1" 500 59
----------------------------------------
Exception happened during processing of request from ('127.0.0.1', 53113)
Traceback (most recent call last):
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\wsgiref\handlers.py", line 138, in run
    self.finish_response()
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\wsgiref\handlers.py", line 180, in finish
_response
    self.write(data)
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\wsgiref\handlers.py", line 279, in write
    self._write(data)
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\wsgiref\handlers.py", line 453, in _write

    result = self.stdout.write(data)
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\socketserver.py", line 775, in write
    self._sock.sendall(b)
ConnectionResetError: [WinError 10054] Foi forçado o cancelamento de uma conexão existente pelo host remoto

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\wsgiref\handlers.py", line 141, in run
    self.handle_error()
  File "C:\Users\eduardo\Envs\ProExC\lib\site-packages\django\core\servers\basehttp.py", line 88, in handle_erro
r
    super(ServerHandler, self).handle_error()
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\wsgiref\handlers.py", line 368, in handle
_error
    self.finish_response()
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\wsgiref\handlers.py", line 180, in finish
_response
    self.write(data)
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\wsgiref\handlers.py", line 274, in write
    self.send_headers()
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\wsgiref\handlers.py", line 331, in send_h
eaders
    if not self.origin_server or self.client_is_modern():
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\wsgiref\handlers.py", line 344, in client
_is_modern
    return self.environ['SERVER_PROTOCOL'].upper() != 'HTTP/0.9'
TypeError: 'NoneType' object is not subscriptable

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\socketserver.py", line 639, in process_re
quest_thread
    self.finish_request(request, client_address)
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\socketserver.py", line 361, in finish_req
uest
    self.RequestHandlerClass(request, client_address, self)
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\socketserver.py", line 696, in __init__
    self.handle()
  File "C:\Users\eduardo\Envs\ProExC\lib\site-packages\django\core\servers\basehttp.py", line 155, in handle
    handler.run(self.server.get_app())
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\wsgiref\handlers.py", line 144, in run
    self.close()
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\wsgiref\simple_server.py", line 35, in cl
ose
    self.status.split(' ',1)[0], self.bytes_sent
AttributeError: 'NoneType' object has no attribute 'split'
----------------------------------------
[21/Sep/2017 23:32:44] "GET /media/posts/03_-_The_Mute.mp3 HTTP/1.1" 200 1179648
Traceback (most recent call last):
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\wsgiref\handlers.py", line 138, in run
    self.finish_response()
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\wsgiref\handlers.py", line 180, in finish
_response
    self.write(data)
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\wsgiref\handlers.py", line 279, in write
    self._write(data)
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\wsgiref\handlers.py", line 453, in _write

    result = self.stdout.write(data)
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\socketserver.py", line 775, in write
    self._sock.sendall(b)
ConnectionResetError: [WinError 10054] Foi forçado o cancelamento de uma conexão existente pelo host remoto
[21/Sep/2017 23:32:44] "GET /media/posts/03_-_The_Mute.mp3 HTTP/1.1" 500 59
----------------------------------------
Exception happened during processing of request from ('127.0.0.1', 53114)
Traceback (most recent call last):
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\wsgiref\handlers.py", line 138, in run
    self.finish_response()
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\wsgiref\handlers.py", line 180, in finish
_response
    self.write(data)
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\wsgiref\handlers.py", line 279, in write
    self._write(data)
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\wsgiref\handlers.py", line 453, in _write

    result = self.stdout.write(data)
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\socketserver.py", line 775, in write
    self._sock.sendall(b)
ConnectionResetError: [WinError 10054] Foi forçado o cancelamento de uma conexão existente pelo host remoto

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\wsgiref\handlers.py", line 141, in run
    self.handle_error()
  File "C:\Users\eduardo\Envs\ProExC\lib\site-packages\django\core\servers\basehttp.py", line 88, in handle_erro
r
    super(ServerHandler, self).handle_error()
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\wsgiref\handlers.py", line 368, in handle
_error
    self.finish_response()
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\wsgiref\handlers.py", line 180, in finish
_response
    self.write(data)
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\wsgiref\handlers.py", line 274, in write
    self.send_headers()
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\wsgiref\handlers.py", line 331, in send_h
eaders
    if not self.origin_server or self.client_is_modern():
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\wsgiref\handlers.py", line 344, in client
_is_modern
    return self.environ['SERVER_PROTOCOL'].upper() != 'HTTP/0.9'
TypeError: 'NoneType' object is not subscriptable

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\socketserver.py", line 639, in process_re
quest_thread
    self.finish_request(request, client_address)
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\socketserver.py", line 361, in finish_req
uest
    self.RequestHandlerClass(request, client_address, self)
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\socketserver.py", line 696, in __init__
    self.handle()
  File "C:\Users\eduardo\Envs\ProExC\lib\site-packages\django\core\servers\basehttp.py", line 155, in handle
    handler.run(self.server.get_app())
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\wsgiref\handlers.py", line 144, in run
    self.close()
  File "c:\users\eduardo\appdata\local\programs\python\python36-32\Lib\wsgiref\simple_server.py", line 35, in cl
ose
    self.status.split(' ',1)[0], self.bytes_sent
AttributeError: 'NoneType' object has no attribute 'split'
---------------------------------------

Изменить:

Использование Django 1.11.3, Windows 10, протестировано с Opera и Chrome, запуск сервера с использованием gulp

**Редактировать 2: **

Эй, ошибка ПРОИСХОДИТ ТОЛЬКО, если в html есть тег iframe!!


person EduardoMaia    schedule 22.09.2017    source источник


Ответы (3)


первая ошибка self.environ['SERVER_PROTOCOL'].upper() терпит неудачу, потому что self.environ['SERVER_PROTOCOL'] имеет значение None, и вы не можете сделать None.upper(), вы можете сделать .upper() только для строк (насколько мне известно).

вторая ошибка self.status.split(' ',1)[0], self.bytes_sent AttributeError: 'NoneType' object has no attribute 'split' Это не удается, потому что ваш self.status равен None, и вы не можете сделать None.split(), опять же, это должна быть строка.

Таким образом, похоже, что некоторые из необходимых значений для этих классов не инициализируются или не передаются.

Похоже, проблема связана с Django.core и WSGIref, поэтому либо конфигурация неверна, либо проблема связана с установленной вами версией?

Какую версию Django вы используете? Также вы запускаете сервер с ./manage.py runserver?

[обновление 2017-09-28]

Есть несколько вещей, которые я изменил, во-первых, я не копирую request.POST в новый dict перед его передачей, это может быть причиной исчезновения некоторых значений при попытке обработать сообщение.

Я также передаю пользователя как kwarg в вашу форму, а не пытаюсь внедрить его в скопированный POST.

в основном я только что обновил часть кода, чтобы его было немного легче читать, давайте посмотрим, как это пойдет.

# forms.py
class PostForm(forms.ModelForm):
    categoria = forms.ChoiceField(choices=[("Video","Vídeo"),("Audio","Aúdio"),("Imagem","Imagem"),("Musica","Música")], required=True)
    thumbnail = forms.FileField(required=False)

    class Meta:
        model = Postagem
        fields = ['descricao', 'area', 'user', 'post']

    def __init__(self, *args, **kwargs):  # handle user kwarg
        if 'user' in kwargs.keys():
            self.user = kwargs.pop('user')
        super(PostForm, self).__init__(*args, **kwargs)

# views.py
def profileView(request):
    form = None    
    if request.method == 'POST':
        exception=None
        if "categoria" in request.POST:
            if request.user:
                form = PostForm(request.POST,request.FILES, user=request.user)  # pass user as a kwarg
                print("postform POST: ",newPost, " File ",request.FILES)
                if form.is_valid():
                    print("valid")
                    try:
                        form.save()
                        print("saved")
                        return HttpResponseRedirect(reverse_lazy('accounts:profile'))
                    except IntegrityError as e:
                        print("Integrity Error")
                        exception=e            
                else:
                    print("PostForm error")
                    print(form.errors)
                #form has been indented as previously it would have been called before being initialised
                form.non_field_errors=form.errors
                if exception is not None:
                    form.non_field_errors.update(exception)
    posts = Postagem.objects.get_queryset().order_by('id')
    paginator = Paginator(posts, 12)
    page = None
    if request.GET:
        page = request.GET.get('page')
    areas = Area.objects.all()   
    try:
        posts = paginator.page(page)
    except PageNotAnInteger:
        # If page is not an integer, deliver first page.
        posts = paginator.page(1)
    except EmptyPage:
        # If page is out of range (e.g. 9999), deliver last page of results.
        posts = paginator.page(paginator.num_pages)
    #return values    
    return render(
        request,
        'accounts/profile.html',
        {
            'form': form,
            'areas': areas,
            'posts': posts,
        }
    )
person BenDog    schedule 22.09.2017
comment
Проблема в том, что это self.environ и self.status не относятся конкретно к моему проекту. Я запускаю сервер с помощью gulp. У меня Джанго 1.11.3. - person EduardoMaia; 22.09.2017
comment
у вас есть эта проблема, когда вы запускаете сервер django с помощью ./manage.py runserver? - person BenDog; 22.09.2017
comment
Да... Gulp в основном делает runserver, а затем следите за изменениями, чтобы снова запустить runserver... - person EduardoMaia; 22.09.2017
comment
self.status и self.environ выглядят так, как будто они из модуля WSGIref, который использует django. Я не уверен, что делает gulp для запуска сервера, но, возможно, он удаляет некоторые из ожидаемых заголовков? - person BenDog; 22.09.2017
comment
что произойдет, если вы не добавите userContext в список контекстов? может быть, userContext включает неожиданные значения? вы должны иметь возможность получить все эти данные из request.user, поэтому вам не нужно передавать какие-либо из этих значений обратно в функцию рендеринга. - person BenDog; 22.09.2017
comment
Остается та же ошибка. Возможно, вы пролистали, ошибка исчезает, как только исчезают сообщения с видео и песнями. Поэтому, хотя я продолжаю передавать пользовательский контекст, ошибки нет, если нет видеосообщения. Как только он есть, ошибка продолжает появляться - person EduardoMaia; 23.09.2017
comment
Мне трудно следовать вашей логике в исходном сообщении, кажется, что интервал был потерян, и то, как вы присваиваете значения контекстному словарю на лету, а не используете литерал словаря, когда вы возвращаетесь, делает его довольно трудным для читать. - person BenDog; 28.09.2017
comment
я обновил свой ответ некоторыми изменениями кода, которые могут помочь - person BenDog; 28.09.2017
comment
Делая это так, я получил ошибку формы. Поле «пользователь» является обязательным. Я скопировал ваш код, но это не сработало. Что касается моего кода, есть ли у вас какие-либо советы? Первый раз, когда я кодировал Python здесь, я не совсем понял, что означает «интервал, кажется, был потерян», и я не знал, что размещение литералов было нормой, извините. - person EduardoMaia; 28.09.2017
comment
Я не знаю, получаете ли вы уведомление, когда я редактирую, поэтому я просто повторю это здесь. ошибка ТОЛЬКО ПРОИСХОДИТ, если в html есть тег iframe!! - person EduardoMaia; 28.09.2017

Похоже, это ошибка python:

Билет Django: https://code.djangoproject.com/ticket/26995 Билет Python: https://bugs.python.org/issue14574

Пока не удалось решить, если я смогу, я отредактирую этот ответ, подробно объяснив, как его решить.

Изменить

Кажется, это ошибка в хроме. Мне это не пришло, потому что я использовал Opera, но Opera также использует хром. В Internet Explorer ошибка не показывалась.

https://code.djangoproject.com/ticket/21227#no1

Это трекер ошибок

person EduardoMaia    schedule 28.09.2017
comment
Я бы этого совсем не ожидал, хотя это имело смысл, это выглядело как проблема с WSGIref. Рассматривали ли вы возможность не использовать iframe? - person BenDog; 29.09.2017

Вы используете PostgreSQL? Это может быть вызвано кодовой страницей . ошибка.

C:\>psql -U postgres
psql (10.5)
WARNING: Console code page (850) differs from Windows code page (1252)
         8-bit characters might not work correctly. See psql reference
         page "Notes for Windows users" for details.
Type "help" for help.

postgres=#

Попытка установить кодовую страницу перед запуском Django.

cmd.exe /c chcp 1252
person Karl Penzhorn    schedule 08.03.2019