2017-06-25 58 views
5

Stworzyłem niestandardową stronę admin na mojej stronie Django, gdzie tylko administratorzy będą mogli i będą mogli zmieniać obiekty i ich atrybuty. Ilość obiektów jest dużo (dokładnie 9220) i na stronie administratora są równe ilości pól wejściowych jako obiekty w tym modelu.Jak uniknąć błędu "Liczba przekroczonych parametrów GET/POST"?

Jest to kod:

<form action="{% url 'Home:AdminPrices' %}" id="mainForm" method="post"> 
{% csrf_token %} 
{% for item in prices %} 
    <ul class="row" style="width: 100%;padding: 0;background-color: white;height: 100px;display: flex;justify-content: left;white-space: nowrap;margin-bottom: 0;margin-top: 0;"> 
     <div style="width: 33.333333333333336%;background-color: white;display: block;color: black;font-size: 0.8em;white-space: nowrap;text-align: center;font-family: 'Lato';padding-top: 25px;">{{ item.hashname }}</div> 
     <div style="width: 33.333333333333336%;background-color: white;display: block;color: black;font-size: 1.2em;text-align: center;font-family: 'Lato';padding-top: 25px;">{{ item.sug }}</div> 
     <div style="width: 33.333333333333336%;background-color: white;display: block;color: black;font-size: 1.2em;text-align: center;font-family: 'Lato';"><input type="number" value="{{ item.actual }}" name="prices_{{ item.actual }}" style="width: 100%;height: 100%;padding-bottom: 25px;background-color: white;border: 0;color: black;font-size: 1.2em;text-align: center;font-family: 'Lato';"></input></div> 
    </ul> 
{% endfor %} 
    <input type="submit" id="mainSubmit" style="display: none;" name="submitPrices"></input> 
</form> 
<div onclick="document.getElementById('mainForm').submit();" style="background-color: black;border-radius: 5px;position: fixed;display: block;height: 50px;width: 200px;bottom: 0;left:0;right:0;margin: 0 auto;color: white;font-size: 1.5em;text-align: center;padding-top: 12.5px;cursor: pointer;">Submit</div> 

Kiedy złożyć naciśnięciu przycisku awarii WWW i skłania się ten błąd:

2017-06-25 10:05:53,158: The number of GET/POST parameters exceeded settings.DATA_UPLOAD_MAX_NUMBER_FIELDS. 2017-06-25 10:05:53,860: Error running WSGI application 2017-06-25 10:05:53,934: TooManyFieldsSent: The number of GET/POST parameters exceeded settings.DATA_UPLOAD_MAX_NUMBER_FIELDS. 2017-06-25 10:05:53,934:
File "/home/MTonskins/Tonskins/Selement/senv/local/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 170, in call 2017-06-25 10:05:53,935: response = self.get_response(request) 2017-06-25 10:05:53,935: 2017-06-25 10:05:53,935: File "/home/MTonskins/Tonskins/Selement/senv/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 124, in get_response 2017-06-25 10:05:53,935: response = self._middleware_chain(request) 2017-06-25 10:05:53,936: 2017-06-25 10:05:53,936: File "/home/MTonskins/Tonskins/Selement/senv/local/lib/python2.7/site-packages/django/core/handlers/exception.py", line 41, in inner 2017-06-25 10:05:53,936: response = response_for_exception(request, exc) 2017-06-25 10:05:53,936: 2017-06-25 10:05:53,936: File "/home/MTonskins/Tonskins/Selement/senv/local/lib/python2.7/site-packages/django/core/handlers/exception.py", line 76, in response_for_exception 2017-06-25 10:05:53,937:
response = debug.technical_500_response(request, *sys.exc_info(), status_code=400) 2017-06-25 10:05:53,937: 2017-06-25 10:05:53,937:
File "/home/MTonskins/Tonskins/Selement/senv/local/lib/python2.7/site-packages/django/views/debug.py", line 84, in technical_500_response 2017-06-25 10:05:53,937: html = reporter.get_traceback_html() 2017-06-25 10:05:53,937: 2017-06-25 10:05:53,937: File "/home/MTonskins/Tonskins/Selement/senv/local/lib/python2.7/site-packages/django/views/debug.py", line 316, in get_traceback_html 2017-06-25 10:05:53,938: c = Context(self.get_traceback_data(), use_l10n=False) 2017-06-25 10:05:53,938: 2017-06-25 10:05:53,938: File "/home/MTonskins/Tonskins/Selement/senv/local/lib/python2.7/site-packages/django/views/debug.py", line 293, in get_traceback_data 2017-06-25 10:05:53,938:
'filtered_POST': self.filter.get_post_parameters(self.request), 2017-06-25 10:05:53,938: 2017-06-25 10:05:53,938: File "/home/MTonskins/Tonskins/Selement/senv/local/lib/python2.7/site-packages/django/views/debug.py", line 167, in get_post_parameters 2017-06-25 10:05:53,938: return request.POST 2017-06-25 10:05:53,938: 2017-06-25 10:05:53,939: File "/home/MTonskins/Tonskins/Selement/senv/local/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 128, in _get_post 2017-06-25 10:05:53,939:
self._load_post_and_files() 2017-06-25 10:05:53,939: 2017-06-25 10:05:53,939: File "/home/MTonskins/Tonskins/Selement/senv/local/lib/python2.7/site-packages/django/http/request.py", line 311, in _load_post_and_files 2017-06-25 10:05:53,939:
self._post, self._files = QueryDict(self.body, encoding=self._encoding), MultiValueDict() 2017-06-25 10:05:53,939: 2017-06-25 10:05:53,940: File "/home/MTonskins/Tonskins/Selement/senv/local/lib/python2.7/site-packages/django/http/request.py", line 397, in init 2017-06-25 10:05:53,940: for key, value in limited_parse_qsl(query_string, **parse_qsl_kwargs): 2017-06-25 10:05:53,940: 2017-06-25 10:05:53,940: File "/home/MTonskins/Tonskins/Selement/senv/local/lib/python2.7/site-packages/django/utils/http.py", line 350, in limited_parse_qsl 2017-06-25 10:05:53,940: 'The number of GET/POST parameters exceeded

nie jestem pewien, w jaki sposób można tego uniknąć, można mogę zmienić ustawienia i ustawić inny limit dla tego widoku? Czy mogę przesłać wszystkie te pola jako jedną listę? Jeśli nie, to jakie może być rozwiązanie? Czy mogę określić ustawienie DATA_UPLOAD_MAX_NUMBER_FIELDS dla określonego widoku? Z góry dziękuję.

+0

Ile przedmiotów jest w cenie? mógłbyś też opublikować pełny zwrot pieniędzy? – zaidfazil

+0

@FazilZaid W modelu Ceny są dokładnie 9220 obiektów. Zaktualizuję teraz odpowiedź z pełnym opóźnieniem. – ShellRox

+1

@FazilZaid Zaktualizowano kod, znam opcję "DATA_UPLOAD_MAX_NUMBER_FIELDS" może rozwiązać problem, ale czy mogę określić opcję tylko do określonego widoku? – ShellRox

Odpowiedz

5

dokumentacji Django stwierdza, że ​​ustawienia nie powinny być zmieniane w miejscu innym niż ustawienia:

https://docs.djangoproject.com/en/1.11/topics/settings/#altering-settings-at-runtime

rozwiązanie, jak wspomniano, jest to wzrost wielkości DATA_UPLOAD_MAX_NUMBER_FIELDS w ustawieniach. Powodzenia!

+0

Witam, dzięki za odpowiedź. Kolejne pytanie, czy nie zwiększyłoby to ryzyka przeciążenia serwera, gdy wiele prób POST/GET zostanie wysłanych przez atakujących? Ponieważ większość widoków mojej witryny pobiera żądania POST, a ten widok może być dostępny tylko dla administratorów. – ShellRox

+1

Potencjalnie, ale istnieją inne poziomy ochrony, takie jak CSRF. Nie martwiłbym się tak bardzo o liczbę pojedynczych pól, jak ich zawartość! – FlipperPA