4

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

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

但没有运气。

还有其他方法吗?

4

2 回答 2

7

您可以将您的网络服务器(Apache、Nginx 等)配置为仅绑定到 localhost。

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

于 2012-07-27T11:44:52.930 回答
5

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

request.META['REMOTE_ADDR'] -- The IP address of the client.

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

import socket
socket.gethostbyaddr(request.META['REMOTE_ADDR'])

并将其与让我们说

socket.gethostbyaddr("127.0.0.1")

但是您需要使用这些标头和值处理许多极端情况。

一个更简单的方法可能是在您的应用程序前面有一个反向代理,它会发送一些 custom_header 之类的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...

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

于 2012-07-27T13:12:13.707 回答