我想在 Django 中创建一个仅限本地主机的 API,并且我试图找到一种方法来限制仅从服务器本身(本地主机)访问视图?我试过使用:
- 'HTTP_HOST',
- 'HTTP_X_FORWARDED_FOR',
- 'REMOTE_ADDR',
- 'SERVER_ADDR'
但没有运气。
还有其他方法吗?
我想在 Django 中创建一个仅限本地主机的 API,并且我试图找到一种方法来限制仅从服务器本身(本地主机)访问视图?我试过使用:
但没有运气。
还有其他方法吗?
您可以将您的网络服务器(Apache、Nginx 等)配置为仅绑定到 localhost。
如果您想限制对所有视图的访问,这将很有效,但如果您想允许远程用户访问某些视图,那么您必须配置第二个 Django 项目。
这个问题比仅仅检查一个变量要复杂一些。要识别客户端 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...
但同样 - 这是“防火墙方法”,它将需要更多设置,并确保无法从外部访问应用程序,这不会通过反向代理..