我有一个应用程序谁只有依赖是烧瓶,它在docker外运行良好并绑定到默认端口5000
.这是完整的来源:
from flask import Flask
app = Flask(__name__)
app.debug = True
@app.route('/')
def main():
return 'hi'
if __name__ == '__main__':
app.run()
Run Code Online (Sandbox Code Playgroud)
问题是,当我在docker中部署它时,服务器正在运行但无法从容器外部访问.
下面是我的Dockerfile.图像是安装了烧瓶的ubuntu.tar只包含index.py
上面列出的内容;
# Dockerfile
FROM dreen/flask
MAINTAINER dreen
WORKDIR /srv
# Get source
RUN mkdir -p /srv
COPY perfektimprezy.tar.gz /srv/perfektimprezy.tar.gz
RUN tar x -f perfektimprezy.tar.gz
RUN rm perfektimprezy.tar.gz
# Run server
EXPOSE 5000
CMD ["python", "index.py"]
Run Code Online (Sandbox Code Playgroud)
以下是我要部署的步骤
$> sudo docker build -t perfektimprezy .
据我所知,上面运行正常,图像中有tar的内容/srv
.现在,让我们在一个容器中启动服务器:
$> sudo docker run -i -p 5000:5000 -d …
Run Code Online (Sandbox Code Playgroud) 我想为我的服务器做一些简单的日志记录,这是一个在Docker容器中运行的小型Flask应用程序.
这是Dockerfile
# Dockerfile
FROM dreen/flask
MAINTAINER dreen
WORKDIR /srv
# Get source
RUN mkdir -p /srv
COPY perfektimprezy.tar.gz /srv/perfektimprezy.tar.gz
RUN tar x -f perfektimprezy.tar.gz
RUN rm perfektimprezy.tar.gz
# Run server
EXPOSE 80
CMD ["python", "index.py", "1>server.log", "2>server.log"]
Run Code Online (Sandbox Code Playgroud)
正如您在最后一行所看到的,我将stderr和stdout重定向到一个文件.现在我运行这个容器和shell
docker run -d -p 80:80 perfektimprezy
docker exec -it "... id of container ..." bash
Run Code Online (Sandbox Code Playgroud)
并观察以下事项:
服务器正在运行,网站正常运行
没有 /srv/server.log
ps aux | grep python
收益率:
root 1 1.6 3.2 54172 16240 ? Ss 13:43 0:00 python index.py 1>server.log 2>server.log
root 12 …
Run Code Online (Sandbox Code Playgroud) 我似乎找不到任何方法在JavaFX中使用WebEngine/WebView以编程方式设置cookie .API没有给出任何关于如何获得类似HttpRequest的对象来修改标题(这是我在XML-RPC中使用的应用程序)或任何类型的cookie管理器的想法.
这个页面上的任何问题似乎都没有触及这个问题 - 有这个,但它只是在applet中修复bug时禁用cookie ,我的应用程序在桌面上btw.
我想象的唯一方法是通过请求第一页(需要带有sessionID的cookie才能正确加载),获取"拒绝访问"风格的消息,在页面上下文中执行一些javascript来设置cookie和然后刷新.这个解决方案虽然是一个糟糕的用户体验.
如何使用WebEngine设置cookie?
更新:从上面链接的问题中找到线索,我尝试了解使用CookieManager和相关API的一些示例.我找到了这个代码,然后我尝试将其合并到我的应用程序中,结果很奇怪;
MyCookieStore cookie_store = new MyCookieStore();
CookieManager cookie_manager = new CookieManager(cookie_store, new MyCookiePolicy());
CookieHandler.setDefault(cookie_manager);
WebView wv = new WebView();
Run Code Online (Sandbox Code Playgroud)
现在让我们说这样做:
String url = "http://www.google.com/";
wv.getEngine.go(url);
Run Code Online (Sandbox Code Playgroud)
在发出此请求后在Eclipse中进行调试显示cookie存储映射包含cookie:
{http://www.google.com/=[NID=67=XWOQNK5VeRGEIEovNQhKsQZ5-laDaFXkzHci_uEI_UrFFkq_1d6kC-4Xg7SLSB8ZZVDjTUqJC_ot8vaVfX4ZllJ2SHEYaPnXmbq8NZVotgoQ372eU8NCIa_7X7uGl8GS, PREF=ID=6505d5000db18c8c:FF=0:TM=1358526181:LM=1358526181:S=Nzb5yzBzXiKPLk48]}
Run Code Online (Sandbox Code Playgroud)
WebEngine只使用底层注册的cookie引擎!但等等,真的吗?让我们在发出请求之前尝试添加cookie ...
cookie_store.add(new URL(url).toURI(), new HttpCookie("testCookieKey", "testCookieValue"));
Run Code Online (Sandbox Code Playgroud)
然后我看看Wireshark中的请求......
GET / HTTP/1.1
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/535.14 (KHTML, like Gecko) JavaFX/2.2 Safari/535.14 …
Run Code Online (Sandbox Code Playgroud) 我想形成一个带有两个字段mimetype和value的JSON.值字段应该以字节数组作为其值.
{
"mimetype":"text/plain",
"value":"dasdsaAssadsadasd212sadasd"//this value is of type byte[]
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能完成这项任务?
截至目前,我正在使用toString()
方法将字节数组转换为String并形成JSON.
仍然有相同的问题,主要应用程序代码的修订源:http: //pastebin.com/fLCwuMVq
必须有一些东西CoreTest
阻止UI,但它做各种各样的东西(异步xmlrpc请求,异步http请求,文件io等),我尝试把它全部插入,runLater
但它没有帮助.
我验证了代码运行并正确生成输出,但UI组件无法管理显示它多年
好的我修好了.我不知道为什么,但没有关于JavaFX的指导说明这一点,而且非常重要:
始终将程序逻辑放在与Java FX线程不同的线程中
我有这个使用Swing的,JTextArea
但由于某种原因它不适用于JavaFX.
我尝试调试它并.getText()
在每次写入后执行返回正确写入的字符,但TextArea
GUI中的实际显示没有文本.
我忘了以某种方式刷新它或什么?
TextArea ta = TextAreaBuilder.create()
.prefWidth(800)
.prefHeight(600)
.wrapText(true)
.build();
Console console = new Console(ta);
PrintStream ps = new PrintStream(console, true);
System.setOut(ps);
System.setErr(ps);
Scene app = new Scene(ta);
primaryStage.setScene(app);
primaryStage.show();
Run Code Online (Sandbox Code Playgroud)
和Console
班级:
import java.io.IOException;
import java.io.OutputStream;
import javafx.scene.control.TextArea;
public class Console extends OutputStream
{
private TextArea output;
public Console(TextArea ta)
{
this.output = ta;
}
@Override …
Run Code Online (Sandbox Code Playgroud) 我使用的嵌入式WebView浏览器需要对特定URL进行特殊处理,以在本机默认浏览器而不是WebView中打开它们.实际的浏览部分工作正常但我需要阻止WebView显示该页面.我可以想到几种方法,但没有一种方法可行.这是我的代码:
this.wv.getEngine().locationProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue)
{
Desktop d = Desktop.getDesktop();
try
{
URI address = new URI(observable.getValue());
if ((address.getQuery() + "").indexOf("_openmodal=true") > -1)
{
// wv.getEngine().load(oldValue); // 1
// wv.getEngine().getLoadWorker().cancel(); // 2
// wv.getEngine().executeScript("history.back()"); // 3
d.browse(address);
}
}
catch (IOException | URISyntaxException e)
{
displayError(e);
}
}
});
Run Code Online (Sandbox Code Playgroud)
关于三种情况中每种情况会发生什么的更多信息
wv.getEngine().load(oldValue);
Run Code Online (Sandbox Code Playgroud)
这会杀死JVM.有趣的是,该页面在本机浏览器中打开正常.
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at …
Run Code Online (Sandbox Code Playgroud) 我正在研究WebSocket协议,并尝试在后端使用Python实现一个简单的ECHO服务.它似乎工作正常但连接在建立后立即下降.
这是我的客户:
<!doctype html>
<head>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
function Client()
{
//var ws = new WebSocket("ws://echo.websocket.org"); // this works fine
var ws = new WebSocket("ws://localhost:8000");
ws.onopen = function(e){ $("#response").append(">> Connected<br />"); }
ws.onclose = function(e){ $("#response").append(">> Disconnected<br />"); }
ws.onerror = function(e){ $("#response").append(">> ERROR: " + e.data + "<br />"); }
ws.onmessage = function(e){ $("#response").append("> " + e.data + "<br />"); }
this.sendCmd = function()
{
var message = $("#cmd").val();
$("#response").append(message + "<br />");
ws.send(message);
return false;
} …
Run Code Online (Sandbox Code Playgroud) 作为从JSON API调用解析的多级字典,我有很多输入.字符串都是unicode,这意味着有很多u'stuff like this'
.我正在使用jq来处理结果,需要将这些结果转换为ASCII.
我知道我可以编写一个函数来像这样转换它:
def convert(input):
if isinstance(input, dict):
ret = {}
for stuff in input:
ret = convert(stuff)
elif isinstance(input, list):
ret = []
for i in range(len(input))
ret = convert(input[i])
elif isinstance(input, str):
ret = input.encode('ascii')
elif :
ret = input
return ret
Run Code Online (Sandbox Code Playgroud)
这甚至是正确的吗?不确定.这不是我想问你的.
我要问的是,这是解决问题的典型蛮力解决方案.肯定有更好的办法.一种更加pythonic的方式.我不是算法专家,但这个也不是特别快.
那么还有更好的方法吗?或者如果没有,可以改进这个功能......?
回答后编辑
Mark Amery的回答是正确的,但我想发布它的修改版本.他的函数适用于Python 2.7+而我在2.6上,所以不得不转换它:
def convert(input):
if isinstance(input, dict):
return dict((convert(key), convert(value)) for key, value in input.iteritems())
elif isinstance(input, list):
return [convert(element) for element …
Run Code Online (Sandbox Code Playgroud) 我应该将哪一个用于dektop Java应用程序?或者也许还有另一个真的很好,我不知道它存在吗?
在每个页面加载我运行session_start()
以恢复当前会话.什么时候session.gc_maxlifetime
开始计数?第一次session_start()
被调用并且会话的cookie被设置了?或者计时器是否每次重启session_start()
?
随着session.gc_maxlifetime
一套约24分钟的时候,在这个时间表的会话数据应该被垃圾收集
1. 12:00:00 First page load, session_start(), session cookie created
2. 12:10:00 page load, session_start()
3. 12:26:00 page load, session_start()
4. 12:55:00 page load, session_start()
Run Code Online (Sandbox Code Playgroud)
如果计时器在第一页加载时启动,session_start()
那么我预计它将在加载3上进行垃圾收集.但如果它每次都重置session_start()
,那么它将在加载4之前收集.
我希望它是后者,因为那时我可以每隔几分钟做一次javascript心跳来调用运行的页面session_start()
.
如果它是前者,session.gc_maxlifetime
从创建会话cookie开始计数我需要销毁/重新创建或重新生成_id来重置计数?
java ×3
javafx ×3
python ×3
docker ×2
http-headers ×2
javafx-2 ×2
json ×2
algorithm ×1
ascii ×1
bash ×1
cookies ×1
deployment ×1
dockerfile ×1
flask ×1
httprequest ×1
jackson ×1
javascript ×1
jvm ×1
linux ×1
logging ×1
output ×1
php ×1
printstream ×1
rpc ×1
session ×1
sockets ×1
textarea ×1
unicode ×1
websocket ×1
webview ×1
xml ×1
xml-rpc ×1