在控制台中将数据存储在数据库中并访问它

时间:2018-10-17 18:18:48

标签: django database django-models geolocation

我正在构建一个Web应用程序,当为此按下特定按钮时,它将访问用户的位置。我正在使用HTML geolocation api

下面是location.js文件:

`var x = document.getElementById("demo");
function getLocation() {
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(showPosition);
    } else {
        x.innerHTML = "Geolocation is not supported by this browser.";
    }
}
function showPosition(position) {
    x.innerHTML = "Latitude: " + position.coords.latitude +
    "<br>Longitude: " + position.coords.longitude;
    console.log(position.coords.latitude)
    console.log(position.coords.longitude)
}

以下是HTML文件的代码段:

<button onclick="getLocation()">HELP</button>
<p id="demo"></p>
<script src="../static/location.js"></script>

我想做的就是将此信息(即用户的经度/纬度)发送到与该用户关联的电子邮件列表中,但是我不知道如何存储此数据并在按下按钮后进行访问。 如果有人可以让我开始如何保存与用户相对应的数据并从数据库访问数据,那将很有用。

1 个答案:

答案 0 :(得分:0)

如果要将此信息存储到django DB,则在django视图中这样做可能会更容易。这可能是一个RedirectView,仅在单击按钮后才重定向到同一视图。

我以前使用的是下载的GeoLite2-City.mmdb数据库,该数据库可能并不总是最新的,但是还可以。

您可以使用ipware库在django中获取请求的ip地址。然后将其转换为IPy中的python IP对象。然后,您可以使用geoip库将信息从数据库中获取。

导入以下库;

from ipware.ip import get_ip
from IPy import IP
import geoip2.database

然后您获取IP的方法就像

class MyRedirectView(RedirectView)

    def get_redirect_url(self, request, *args, **kwargs):
        ## Write some code to handle the redirect url first ##

        ip_address = get_ip(self.request)

        """Ensure that the IP address is a valid IP first"""
        try:
            IP(ip_address)
        except Exception:
            logger.exception("GEOIP2 error: ")

        """Then get the IP location"""
        geo_path = settings.GEOIP_PATH
        reader = geoip2.database.Reader(geo_path + '/GeoLite2-City.mmdb')
        try:
            response = reader.city(ip_address)
            city = response.city.name
            country = response.country.name

         ### Some code here to save to your DB
        return super(MyRedirectView, self).get_redirect_url(*args, **kwargs)

如果您需要更准确的IP位置服务,则可以将API调用加入到http://ip-api.com/之类的东西中。但是随后您必须等待此响应,然后才能提供下一个视图。