Python Django项目中的国别访问限制

Python Django项目中的国别访问限制,python,django,Python,Django,当用户打开Django项目的任何链接时,在打开此链接之前,我想应用国家限制。管理员有权在数据库表中添加国家,若国家在表中可用,那个么url将打开,否则它将显示一条消息,受限国家 您只需找出用户的国家(例如,和免费的Maxmind数据库),然后对照数据库表/模型中的国家列表检查确定的国家,如果不通过,则引发异常。这可以通过两种方式完成,一种是将IP地址映射到@AKX已经指向的国家,或者,将纬度、经度映射到一个国家。任何前端客户端Web/Mobile都可以使用其本机API为用户提供lat-long。

当用户打开Django项目的任何链接时,在打开此链接之前,我想应用国家限制。管理员有权在数据库表中添加国家,若国家在表中可用,那个么url将打开,否则它将显示一条消息,受限国家


您只需找出用户的国家(例如,和免费的Maxmind数据库),然后对照数据库表/模型中的国家列表检查确定的国家,如果不通过,则引发异常。

这可以通过两种方式完成,一种是将IP地址映射到@AKX已经指向的国家,或者,将纬度、经度映射到一个国家。任何前端客户端Web/Mobile都可以使用其本机API为用户提供lat-long。这些数据可以用来查询谷歌地图API。 api看起来像这样,您必须注册才能获得密钥

https://maps.googleapis.com/maps/api/geocode/json?latlng=<lat>,<long>&key=<key>

def check_for_whitelisted_country(lat, long)
    r = requests.get(api)
    if r.status_code == 200:
    data = json.loads(r.text)
    for item in data['results'][0]['address_components']:
        if 'country' in item['types']:
            country = item['long_name']
            # if country in database return True

希望这有帮助。

您可以在Django中使用中间件(请参阅)

编写自定义中间件,将
请求
作为参数。对于每个
请求
,我们都会在
远程地址
中获得IP地址。获取此IP地址并查找他的国家/地区(您可以为此使用第三方API)

根据您的限制区域检查用户的区域。如果受到限制,则发送错误消息作为响应。

我对CodeIgniter中的上述功能有所了解。我已经申请了一个PHP(CodeIgniter)项目。在CodeIngiter中,我创建了MyController并扩展了CI_控制器,并在MyController中编写了函数,因此在打开任何页面之前,它将限制My_控制器中的用户。同样,Django中也有任何可用的概念。编写一个中间件或视图装饰器来轻松共享代码。我想知道,在Django中,我将在哪里为用户编写代码。例如:在我的Django应用程序中,有50多个URL。因此,不可能在所有函数中写入密码。我想创建一个通用函数并在一个地方应用该函数应适用于所有url。@tarique我已经更新了我的答案以演示您的用例。
class DoSomething(views.APIView):

    def get(self, request):
        try:
            lat = request.GET['lat']
            long = request.GET['long']
            if check_whitelisted_country(lat, long):
               # permit the action
            else:
                return Response({"Failure": "Invalid client."}, status=status.HTTP_403_FORBIDDEN)