从现有的sqlite数据库获取数据到网页

时间:2018-08-14 08:29:06

标签: javascript sqlite web-services

我有创建SqLite DB的桌面应用程序。

我想使用这些数据在本地静态网页上进行报告。 但是,我不确定如何连接到现有数据库-我知道与此相关的安全问题。

使用JavaScript可以做到吗?我该怎么办?

2 个答案:

答案 0 :(得分:2)

一种选择是像这样传递模板中的数据:

def index(request):
    # Calculate your precious data here, for example using the django.core.serializers class:
    data = serializers.serialize('json', FooModel.objects.all())
    return render(request, 'templates/index.html', {'data': data})

然后在您的templates/index.html中,您可以执行以下操作:

<script>
    window.data = {{data|default:"{}"|safe}};
</script>

签出safe filter

通过这种方式,您可以通过初始请求从后端到前端获取所有数据,而无需创建任何其他请求,也无需使用JS直接与数据库通信。


另一个选择是使用fetch

您可以创建一个视图(可以使用Django REST框架,但这取决于您要使用的视图,无论如何,主要思想仍然是相同的):

from django.http import HttpResponseNotAllowed, JsonResponse
from django.core import serializers
from .models import FooModel # for example

def myview(request):
    if request.method != "POST":
        return HttpResponseNotAllowed(['POST'], "Only POST is allowed to this URL.")
    # Get your precious data, let's use the same example as before:
    data = serializers.serialize('json', FooModel.objects.all())
    return JsonResponse(data)

在您的urls.py中注册:

urlpatterns = [
    ...
    path('api/retrievepreciousdata', views.myview),
    ...
]

然后我们可以使用fetch来检索它:

fetch("/api/retrievepreciousdata", {
    method: "POST",
    headers: {
        //For CSRF protection:
        //I use `js-cookie` to get the cookies, it's up to you really
        "X-CSRFToken": Cookies.get("csrftoken"),
        "X-Requested-With": "XMLHttpRequest",
    },
}).then(response => {
    if(!response.ok) {
        console.log("Dang it, the response isn't OK... Response code is", response.status);
    }
    return response.json()
}).then(json => {
    console.log("I did it! My precious data is:", json);
}).catch(e => {
    console.log("Dang it, something went wrong while retrieving my precious data:", e);
});

答案 1 :(得分:0)

如果您正在寻找一种从静态网页从SQLlite Db读取数据的方法,建议您阅读以下线程Is it possible to access an SQLite database from JavaScript?

SQL.js(在上面的主题中提到)也可以尝试