仅限服务器本身(localhost)限制对Django视图的访问

use*_*722 4 django django-views

我想在Django中创建一个仅限localhost的API,我试图找到一种方法来限制只从服务器本身(localhost)访问视图?我尝试过使用:

  • 'HTTP_HOST',
  • 'HTTP_X_FORWARDED_FOR',
  • 'REMOTE_ADDR',
  • 'SERVER_ADDR'

但没有运气.

还有其他方法吗?

Ala*_*air 7

您可以将Web服务器(Apache,Nginx等)配置为仅绑定到localhost.

如果您想限制对所有视图的访问,这将很有效,但如果您想允许从远程用户访问某些视图,那么您必须配置第二个Django项目.


Tis*_*sho 7

这个问题比仅仅检查变量要复杂一些。要识别客户端 IP 地址,您需要

request.META['REMOTE_ADDR'] -- The IP address of the client.
Run Code Online (Sandbox Code Playgroud)

然后将其与 进行比较request.get_host()。但您可能会考虑到服务器可能在 0.0.0.0:80 上启动,因此您可能需要执行以下操作:

import socket
socket.gethostbyaddr(request.META['REMOTE_ADDR'])
Run Code Online (Sandbox Code Playgroud)

并将其与我们说的进行比较

socket.gethostbyaddr("127.0.0.1")
Run Code Online (Sandbox Code Playgroud)

但是您需要使用这些标头和值处理大量边缘情况。

一种更简单的方法可能是在您的应用程序前面有一个反向代理,它会发送一些像X_SOURCE=internet. 然后,您可以将来自互联网的流量设置为通过代理,而本地流量(在您的本地网络中)直接进入网络服务器。因此,如果您只想从本地网络访问特定视图,只需检查此标头:

if 'X_SOURCE' in request.META:
    # request is coming from internet, and not local network....
else:
    # presumably we have a local request...
Run Code Online (Sandbox Code Playgroud)

但同样,这是“防火墙方法”,它需要更多的设置,并确保不可能从外部访问该应用程序,而不会通过反向代理。