gpt4 book ai didi

python - 如何将 Python flask 应用程序加载到 gtk webview (Webkit)

转载 作者:行者123 更新时间:2023-11-28 16:36:35 24 4
gpt4 key购买 nike

我目前正在开发一个应用程序,该应用程序需要(从 latex )呈现数学表达式并且需要某种本 map 形用户界面(即使它只使用 gtk,然后在 webkit 中呈现 html)。

我做了一些研究并决定一个简单的方法来做到这一点是使用 webkit 加载网页并使用像 MathJax 这样的 JavaScript 库来呈现数学。我选择以这种方式而不是其他解决方案的其他一些原因是我有相当多的使用 python 开发 Web 应用程序的经验(虽然不久前),缺乏使用 native guis 和它提供的可移植性的经验。

对于网络应用程序框架,我选择使用 flask,因为它是我最熟悉的框架。

问题是这个应用程序需要通过最好的 gtk 拥有它自己的 native GUI(即使只是使用 webkit 呈现 html)并且最好不应该有一个连接到某个套接字的 http 服务器。

所以我的问题是,除了运行 flask 的服务器之外,还有什么方法可以做这样的事情:

import gtk
import webkit

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
return "<h1>Hello World!</h1>"

if __name__ == '__main__':
window = gtk.Window()

webview = webkit.WebView()

webview.load_string(
app.load_from_uri('/'),
"text/html",
"utf-8",
'/'
)

window.add(webview)
window.show_all()

app.load_from_uri('/') 仅用作为 Flask 应用程序的给定 uri 加载网页的方法示例。但这只是一个示例,app.load_from_uri('/') 如何在实际代码中完成?

当用户点击一个链接时,无论如何也有覆盖,所以它会做这样的事情:

def link_clicked(uri):
webview.load_string(
app.load_from_uri(uri),
"text/html",
"utf-8",
uri
)

非常感谢任何帮助!

最佳答案

我最终自己找到了解决方案(但对更好的方案持开放态度)。

首先,加载页面非常简单。 Flask 提供了一种测试应用程序的方法,主要是设置 WSGI 能够处理请求的所有内容。这正是我所需要的,所以我这样使用它:

from flask import Flask
class WebViewFlask(Flask):
"""
Adds the ability to load a uri without the
need of a HTTP server.
"""
def load_from_uri(self, uri):
"""
Loads a uri without a running HTTP server.
"""
with self.test_client() as c:
response = c.get(uri)
return response.data, response.mimetype

第二部分,覆盖“当用户单击链接时”,有点棘手。

import os
import webkit
class FlaskAppView(webkit.WebView):
"""
Loads pages for flask apps into a WebView.
"""
def __init__(self, flask_app, *args, **kwargs):
# Protocol for flask app, by default file:// is used
# so a protocol is defined here to prevent that.
self.PROTOCOL = 'flask://'

super(webkit.WebView, self).__init__(*args, **kwargs)

self._flask_app = flask_app

# Register new navigation handler.
self.connect(
"navigation-policy-decision-requested",
self._nav_request
)

# For navigation handler.
self.prev_uri = None

# Redefine open like this as when using super
# an error like this occurs:
# AttributeError: 'super' object has no attribute 'open'
self._open = self.open
self.open = self.open_

def _nav_request(self, view, frame, net_req, nav_act, pol_dec):
"""
WebView navigation handler for Flask apps.
"""
# Get the uri
uri = net_req.get_uri()

# In order for flask apps to use relative links
# the protocol is removed and it is made into an absolute
# path.
if uri.startswith(self.PROTOCOL):
# In this case it is not relative but
# it needs to have it's protocol removed
uri = uri[len(self.PROTOCOL):]

elif not self.prev_uri.endswith(uri):
# It is relative and self.prev_uri needs to
# be appended.
uri = os.path.normpath(os.path.join(self.prev_uri, uri))

# This is used to prevent an infinite recursive loop due
# to view.load_string running this function with the same
# input.
if uri == self.prev_uri:
return False

self.prev_uri = uri

# Create response from Flask app.
response = app.load_from_uri(uri) + ('utf-8', uri)

# Load response.
view.load_string(*response)

# Return False to prevent additional
# handlers from running.
return False

def open_(self, uri):
"""
Prepends protocol to uri for webkit.WebView.open.
"""
self._open(self.PROTOCOL + uri)

基本上,一个新的导航事件处理程序是用一些代码注册的,以允许成功递归和支持相对路径。

无论如何,使用上面的代码只需将 Flask 替换为 WebViewFlask 并将 WebView 替换为 FlaskAppView 一切就差不多了刚刚好。

结果: result

这是一个在 webkit.WebView 中加载的 flask 应用程序,没有任何类型的服务器。最好的事情是只需将 app 切换回 Flask 实例而不是 WebViewFlask 它又是一个普通的 webapp。

关于python - 如何将 Python flask 应用程序加载到 gtk webview (Webkit),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25416448/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com