无法在部署服务器上读取请求标头

时间:2015-08-03 20:20:23

标签: python django nginx django-rest-framework linode

我在django项目中工作,我正在使用Django Rest Framework构建一个Api,让用户可以在他们的移动设备上获取一些数据。我在每个请求的头字典中发送一些额外的参数,而不仅仅是auth令牌。 我正在使用xocde的IOS模拟器进行本地测试以发出请求。好的,这是我的API视图的一个示例:

class GetChildMainInfoView(APIView):
    authentication_classes = (
        TokenAuthentication,
    )
    permission_classes = (
        IsAuthenticated,
    )

    def get(self, request, format=None):
        api_key = request.META.get('HTTP_API_ID')
        child_id = request.META.get('HTTP_CHILD_ID')

        if not api_key == settings.API_KEY:
            raise Http404

        child = get_object_or_404(
            UserProfile,
            id=child_id,
        )

        if child.avatar:
            avatar = child.avatar.url
        else:
            avatar = None

        child_info = {
            'name': unicode(child),
            'picture': avatar,
        }

        return Response(child_info)

当我在本地服务器上进行get请求测试时,所有操作都完美无缺。但是当我在我的生产服务器上尝试它时,读取API_ID和CHILD_ID标题时会出现问题,该值为None。在我的本地服务器上,响应是child_info dict,但在生产中,响应是未找到的错误(如果不是api_key == settings.API_KEY则提高buf)。  如果我从我的视图逻辑中删除那些并返回一些字符串,如返回Response('response'),我在生产服务器中正确响应,因此我确信在生产服务器中读取额外的标题时存在一些问题。所有这些都在我的本地主机上完美运行,但是在我的生产服务器中,只获得额外的标头会有一些问题,因为授权令牌在本地和生产服务器上完美运行,但API_ID和CHILD_ID标头无法被重新加载。我的生产服务器是linode上的ubuntu机器,该项目是使用uwsgi和nginx部署的,API是Django休息框架......我真的不知道可能是什么,可能是一些DRF设置或一些部署服务器权限?比你多得多帮助。

也许可以帮忙,这是我的iptables服务器配置文件。

#!/bin/sh

# Reset iptables rules
iptables -F

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Web
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# Allow all traffic from localhost
iptables -A INPUT -s 127.0.0.1 -p tcp -j ACCEPT

# SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# Drop all others
iptables -A INPUT -j DROP

2 个答案:

答案 0 :(得分:0)

不确定是否是这样,但你获得的request对象不是Django的django.http.HttpRequest,而是rest_framework.request.Request。您应该使用原始Django的请求对象request._request

因此:

api_key = request._request.META.get('HTTP_API_ID')
child_id = request._request.META.get('HTTP_CHILD_ID')

答案 1 :(得分:0)

好吧最后我发现了这个bug ...是一个nginx配置,标题中有下划线的问题...... http://nginx.org/en/docs/http/ngx_http_core_module.html