ericforgy / pages.jl Goto Github PK
View Code? Open in Web Editor NEWA simple way to create and interact with web pages
License: Other
A simple way to create and interact with web pages
License: Other
This:
Endpoint("/hello") do request::Request
should be:
Endpoint("/hello") do request::HTTP.Request
At least for me it was needed.
And what I get with Pages.pages is really something else than what is shown in the doc.
Jussi Salmela
Line 17 in 73cb8f2
This is probably a failure in my setup, but I'm failing to get Pages.start() to work (in julia 1.0.3) when I'm bundling it up in a fresh container.
using Pages;
Pages.start();
gives UndefVarError: HandlerFunction not defined
relevant lines of pkg status are
[cd3eb016] + HTTP v0.8.0
[7c165e09] + Pages v0.2.2
Any help gratefully received - many thanks.
I can't find a way to route the call properly when query parameters are provided in the URL e.g. http://localhost:8888/hello?id=1
. I expect an id
parameter should be created in the Request
object. Instead, the endpoint for hello
isn't even called and a 404
error is returned. It appears that the whole string (hello?id=1
) becomes the endpoint.
Second, it's common for REST API's to pass arguments as in the path. For example, the route may be specified as http://localhost:8888/hello/<city>
and the client calls it as http://localhost:8888/hello/losangeles
. In that case, a city
parameter should be created and accessible to the method.
See Flask examples (http://flask.pocoo.org/docs/0.12/quickstart/#routing)
after update to latest master branch, a crash occurs.
julia> using Pages
WARNING: Error requiring DataFrames from PlotlyJS:
LoadError: UndefVarError: df not defined
Stacktrace:
[1] include_from_node1(::String) at ./loading.jl:576
[2] include(::String) at ./sysimg.jl:14
[3] err(::PlotlyJS.##264#271, ::Module, ::String) at /usr/lib/julia0.6.2/packages/v0.6/Requires/src/require.jl:42
[4] withpath(::PlotlyJS.##263#270, ::String) at /usr/lib/julia0.6.2/packages/v0.6/Requires/src/require.jl:32
[5] (::PlotlyJS.##262#269)() at /usr/lib/julia0.6.2/packages/v0.6/Requires/src/require.jl:53
[6] _collect(::Array{Function,1}, ::Base.Generator{Array{Function,1},Requires.##3#4}, ::Base.EltypeUnknown, ::Base.HasShape) at ./array.jl:488
[7] loadmod(::Symbol) at /usr/lib/julia0.6.2/packages/v0.6/Requires/src/require.jl:20
[8] require(::Symbol) at ./loading.jl:408
[9] include_from_node1(::String) at ./loading.jl:576
[10] eval(::Module, ::Any) at ./boot.jl:235
[11] _require(::Symbol) at ./loading.jl:490
[12] require(::Symbol) at ./loading.jl:405
[13] eval(::Module, ::Any) at ./boot.jl:235
[14] eval_user_input(::Any, ::Base.REPL.REPLBackend) at ./REPL.jl:66
[15] macro expansion at ./REPL.jl:97 [inlined]
[16] (::Base.REPL.##1#2{Base.REPL.REPLBackend})() at ./event.jl:73
while loading /usr/lib/julia0.6.2/packages/v0.6/PlotlyJS/src/dataframes_api.jl, in expression starting on line 522
by the last sentence, it's strongly PlotlyJS's problem.
please check out if this problem occurs only on my side.
More an issue with my understanding, rather than the codebase. Trying to get a message from a julia function call that was started by a Pages Post back to the originating browser (prior to the calculation returning the body in a http response, as a form of progress bar):
I've now got the blank.html example working (in chrome, the socket didn't work in firefox 61.0.1, but that might be just me). And can see the connection in Pages.connections. I guess if I could get the POST triggered by my javascript to inform the server which client to respond to, I could use Pages.message in julia, but I'm not sure this is the best way, and I can't see a way to access the uid in javascript which I could then append to the POST.
Many thanks for any advice - Gavin
┌ Error: (ErrorException("Unexpected end of input\nLine: 0\nAround: ......\n ^\n"), Base.StackTraces.StackFrame[error(::String) at error.jl:33, _error(::String, ::MemoryParserState) at Parser.jl:142, byteat at Parser.jl:51 [inlined], parse_value(::ParserContext{Dict{String,Any},Int64}, ::MemoryParserState) at Parser.jl:162, #parse#1(::Type, ::Type{Int64}, ::Function, ::String) at Parser.jl:414, parse at Parser.jl:412 [inlined], (::##13#16)(::WebSocket{Transaction{TCPSocket}}) at server.jl:27, #upgrade#8(::Bool, ::Function, ::##13#16, ::Stream{Request,Transaction{TCPSocket}}) at WebSockets.jl:144, upgrade at WebSockets.jl:127 [inlined], #12 at server.jl:24 [inlined], handle_stream(::##12#15, ::Stream{Request,Transaction{TCPSocket}}) at Servers.jl:484, (::##55#56{Bool,##12#15,Transaction{TCPSocket},Stream{Request,Transaction{TCPSocket}}})() at task.jl:259])
└ @ HTTP.Servers C:\Users\Eric\.julia\packages\HTTP\YjRCz\src\Servers.jl:464
I would like to stream data from Julia to Vega-Lite to create updating plots. Could you add a MWE (an echo server for example) for using websockets? Here is what I'm trying to achieve, but with the echo server being replaced with a Julia server. I can probably figure out how to convert the example to use the messaging protocol of Pages.jl, but I do not know how to set the websocket connection up.
hello, EricForgy!
I'm testing Pages to replace from python-flask.
In flask, I can recieve requested data both GET and POST.
I wrote code like below,
`using Pages, JSON
Pages.Endpoint("/") do request::Request
json_out = Dict()
#param = Pages.query_params(Pages.URI(request.resources))
#=if request.method == "GET"
pass
elseif request.method == "POST"
pass
end=#
#println(fieldnames(request))
println(request.method)
println(request.resource)
println(request.headers)
println(request.data)
println(request.uri)
json_out["a"] = 1
println(string(json_out))
return JSON.json(json_out)
end
Pages.Endpoint("/shutdown") do request::Request
json_out = Dict()
try
exit()
json_out["result"] = "success"
catch error
json_out["result"] = string(error)
end
return JSON.json(json_out)
end
Pages.start(9000)`
I run very successful, but cannot recieve post datas.
when i post to "/" with python,
requests.post("http://localhost:9000", data = json.dumps({"dump": "a"}))
server prints,
POST
/
Dict{AbstractString,AbstractString}(Pair{AbstractString,AbstractString}("Connection", "keep-alive"),Pair{AbstractString,AbstractString}("http_major", "1"),Pair{AbstractString,AbstractString}("Content-Length", "13"),Pair{AbstractString,AbstractString}("Host", "localhost:9000"),Pair{AbstractString,AbstractString}("Accept", "/"),Pair{AbstractString,AbstractString}("http_minor", "1"),Pair{AbstractString,AbstractString}("Keep-Alive", "1"),Pair{AbstractString,AbstractString}("User-Agent", "python-requests/2.18.4"),Pair{AbstractString,AbstractString}("Accept-Encoding", "gzip, deflate"))
UInt8[0x7b, 0x22, 0x64, 0x75, 0x6d, 0x70, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x22, 0x7d]
:/
so there is no data I posted, json.dumps({"dump": "a"})
is there any way to do this?
"notify" Callback
function calls warn()
which is no longer available on Julia 1.0+. Please fix this issue.
https://julialang.slack.com/archives/C6A044SQH/p1516365200000613
Still needs testing, but try
> Pkg.add("Pages")
> Pkg.checkout("Pages") # To get master
> Pkg.examples() # Note: This will start a server and launch a page in a browser tab.
Note: Try to reproduce the Lorenz attractor example
http://docs.juliaplots.org/latest/#simple-is-beautiful
using Plotly
Hello, great work on this project. It seems to be just what I need and I hope that I can eventually help supplement this project. Unfortunately, I had to be a bit determined at hacking away at this to get it working as indicated per the readme and eventually came to the realization that what you have here on github is much more complete than what I got on either of my computers (work and home) using Pkg.add("Pages")
Is this due to some error on my part or what is going on here?
For some context, I am using julia v0.6.0 on Ubuntu. I was comparing the code on github and realized that the line numbers did not line up with the same code on my computer. I ended up cut-pasting the code and then re-running things after saving and everything works as expected.
Pages.examples()
# click blank
Pages.randomping()
works fine, however if I interrupt it in the REPL using CTRL+C
it throws the error and then it seems the server is not closed gracefully (?).
I think this can be solved by using
try while true
sleep(1)
e = Element(string(count),innerHTML = "Ping $(count): $(round(time()-t0,digits=2)) seconds")
e.style["color"] = rand(["red","green","blue"])
rand() < .5 && Pages.appendChild(e)
count += 1
tstart = time()
end
catch err
if isa(err, InterruptException)
# close server gracefully
else
throw(err)
end
end
The "close server gracefully" part I'm not sure. Maybe one way is to let Pages.start
take a socket and then close that, something like
ipaddr = ip"127.0.0.1"
port = 8000
inetaddr = Sockets.InetAddr(ipaddr, port)
server = Sockets.listen(inetaddr)
Then in start
have something like
HTTP.listen(ip"0.0.0.0", p, readtimeout=0, server=server) do http
# ...
and finally in the caught interruption above
# on interrupt
close(server)
?
Do we need to worry about this?
(note to self :))
Sorry if this is a dumb question but I have not been able to get files to the client unless they are specified as per the following:
Endpoint("/test.js") do request::Request readstring(joinpath(dirname(@__FILE__),"test.js")) end
What I would like to do is specify the directory and have all of its files available as the client may request them. Is there something I've overlooked because I can't seem to get that working.
How can I perform posts, puts and deletes?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.