我如何配置django rest框架分页URL

Bra*_*low 10 django django-rest-framework

当我在django rest框架中获得一个对象时,url总是绝对地使用localhost,但是在生产中我通过nginx上的代理,有没有办法在设置中设置这个url

count: 11
next: "http://localhost:8000/api/accounts/?ordering=-date_registered&page=2"
previous: null
Run Code Online (Sandbox Code Playgroud)

我需要它

count: 11
next: "http:/example.com/api/accounts/?ordering=-date_registered&page=2"
previous: null
Run Code Online (Sandbox Code Playgroud)

----------编辑--------------------------

请看我完整的nginx配置

server {
    listen 80;
    server_name 123.123.123.123;
    root            /home/admin/www/site-web/dist;
    index           index.html;
    charset         utf-8;


    location /static/ {
        alias /home/admin/www/site/static/;
    }

    location /media/  {
        alias /home/admin/www/site/media/;
    }

    location /nginx_status/ {
        # Turn on nginx stats
        stub_status on;
        # I do not need logs for stats
        access_log  off;
        # Security: Only allow access from 192.168.1.100 IP #
        # allow 192.168.1.100;
        # Send rest of the world to /dev/null #
        # deny all;
   }

    location / {
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        try_files $uri $uri/ /index.html;

       if ($request_method = 'OPTIONS') {
            add_header 'Access-Control-Allow-Origin' '*';
            #
            # Om nom nom cookies
            #
            add_header 'Access-Control-Allow-Credentials' 'true';
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
            #
            # Custom headers and headers various browsers *should* be OK with but aren't
            #
            add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
            #
            # Tell client that this pre-flight info is valid for 20 days
            #
            add_header 'Access-Control-Max-Age' 1728000;
            add_header 'Content-Type' 'text/plain charset=UTF-8';
            add_header 'Content-Length' 0;
            return 204;
             }

        if ($request_method = 'POST') {
            add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Allow-Credentials' 'true';
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
            add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
        }

        if ($request_method = 'GET') {
            add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Allow-Credentials' 'true';
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
            add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
         }
    }

   location /docs/ {
       proxy_pass http://127.0.0.1:8000/docs/;
       break;
   }

   location /api/ {
       underscores_in_headers on;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header Host $http_host;
       proxy_redirect off;
       proxy_pass http://127.0.0.1:8000/api/;
       break;
   }

   location /admin/ {
       proxy_pass http://127.0.0.1:8000/admin/;
       break;
   }

}
Run Code Online (Sandbox Code Playgroud)

====超级编辑====

对不起伙计们,我有'underscores_in_headers on;' 我删除它,一切正常

================

Kev*_*own 9

听起来你的Host标题没有正确设置,这在你的nginx配置中会出现问题.问题是您Host发送的标头包含端口号,因此Django在构建URL时包含端口号.这将导致CSRF未来出现问题,因为CSRF检查在您不进行调试时会执行严格的端口检查.

众所周知,出于类似的原因会导致SSL出现问题.

您可以通过将HostNginx中的标头设置为不包括代理端口来解决此问题.

proxy_set_header Host $http_host;
Run Code Online (Sandbox Code Playgroud)

请注意,我使用$http_host变量而不是$host$host:$server_port.这将确保Django仍然会在非标准端口上遵守CSRF请求,同时仍然为您提供正确的绝对URL.


Sin*_*lil 8

设置USE_X_FORWARDED_HOST在你的设置,True并确保你把它传递使用Web服务器(proxy)为好.

当django build_absolute_uri()调用它时get_host()- 请参阅下面的django.http.request:

def get_host(self):
    """Returns the HTTP host using the environment or request headers."""
    # We try three options, in order of decreasing preference.
    if settings.USE_X_FORWARDED_HOST and (
            'HTTP_X_FORWARDED_HOST' in self.META):
        host = self.META['HTTP_X_FORWARDED_HOST']
        ...
Run Code Online (Sandbox Code Playgroud)

请参阅X-Forwarded-Host标头的实际使用情况?