add the server-tornado

main
ColsonZhang 2021-01-20 20:01:46 +08:00
parent 17ba8dbdc8
commit 9953cd9aa2
45 changed files with 15072 additions and 0 deletions

10
MyJade/index.html Normal file
View File

@ -0,0 +1,10 @@
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="jquery-1.11.2.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div class="jade"></div>
</body>
</html>

10346
MyJade/jquery-1.11.2.js vendored Normal file

File diff suppressed because it is too large Load Diff

22
MyJade/myjade.js Normal file
View File

@ -0,0 +1,22 @@
$(document).ready(function () {
$('.jade').each(function(index, div) {
// var j = new jade_defs.jade();
// jade_defs.services(j);
// j.setup(div);
});
});
class Jade{
constructor(){
this.top_level = $( '<div class="jade-top-level">' +
' <div class="jade-tabs-div">'+
'</div>');
}
}

0
MyJade/schematic.js Normal file
View File

58
Server/app.py Normal file
View File

@ -0,0 +1,58 @@
import tornado.ioloop #开启循环,让服务一直等待请求的到来
import tornado.web #web服务基本功能都封装在此模块中
import tornado.options #从命令行中读取设置
from tornado.options import define,options #导入包
from handler import main, auth
# import _thread,threading
from spice import app_spice
define('port',default='8000',help='Listening port',type=int) #定义如何接受传进来的东西
class Application(tornado.web.Application): #引入Application类重写方法这样做的好处在于可以自定义添加另一些功能
def __init__(self):
handlers = [
(r'/',main.IndexHandler),
(r'/login',auth.LoginHandler),
(r'/logout',auth.LogoutHandler),
(r'/register',auth.RegisterHandler),
(r'/spice',main.Spice_Xyce_Handler),
]
settings = dict(
debug = False, #调试模式,修改后自动重启服务,不需要自动重启,生产情况下切勿开启,安全性
template_path='template', #模板文件目录,想要Tornado能够正确的找到html文件需要在 Application 中指定文件的位置
static_path='static', #静态文件目录,可用于用于访问js,css,图片之类的添加此配置之后tornado就能自己找到静态文件
login_url='/login', #没有登录则跳转至此
cookie_secret='1q2w3e4r', # 加密cookie的字符串
pycket={ #固定写法packet用于保存用户登录信息
'engine': 'redis',
'storage': {
'host': 'localhost',
'port': 6379,
'db_sessions': 5,
'db_notifications': 11,
'max_connections': 2 ** 33,
},
'cookie': {
# 'expires_secends': 1*60
'expires_days': 1,
'max_age': 100
}
}
)
super(Application,self).__init__(handlers,**settings) #用super方法将父类的init方法重新执行一遍然后将handlers和settings传进去完成初始化
app = Application() #实例化
if __name__ == '__main__': #当.py文件被直接运行时代码块将被运行当.py文件以模块形式被导入时代码块不被运行。
# 开启 bokeh 服务
app_spice.app_spice_begin()
tornado.options.parse_command_line()
app.listen(options.port) ##如果一个与define语句中同名的设置在命令行中被给出那么它将成为全局的options的一个属性 即 options.port 相当于define的url的port
print("Server start on port {}".format(str(options.port))) #提示服务启动占用端口
tornado.ioloop.IOLoop.current().start() #执行ioloop

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

34
Server/handler/account.py Normal file
View File

@ -0,0 +1,34 @@
import datetime
from .database import *
#用户密码匹配判断函数
def authenticate(username,password):
passwd_db = DB_Check_byName(username)
if passwd_db:
if password == passwd_db:
return True
return False
# 数据库中增加新用户
def add_user(username,password,email=''):
create_time=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
result = DB_Insert_User({'username':username,'password':password,'email':email,'date':create_time})
return result
# USER_DATA = {
# 'name':'user1',
# 'password':'1234'
# }
# USER_DB = [USER_DATA]
# def authenticate(username,password):#用户密码匹配判断函数
# if username and password:
# for i in USER_DB:
# if username == i['name'] and password == i['password']: #是否与保存的一致
# return True
# return False
# def add_user(username,password):
# USER_DB.append({'name':username,'password':password})

59
Server/handler/auth.py Normal file
View File

@ -0,0 +1,59 @@
from .main import AuthBaseHandler
from .account import authenticate, add_user
class LoginHandler(AuthBaseHandler):
def get(self,*args,**kwargs):
self.render('login.html')
def post(self,*args,**kwargs):
username = self.get_argument('username',None)
password = self.get_argument('password',None)
# check the password
passed = authenticate(username,password)
if passed:
# 保存cookie信息到redis数据库
self.session.set('username',username) #将前面设置的cookie设置为username保存用户登录信息
print(self.session.get('username'))
next_url = self.get_argument('next', '') # 获取之前页面的路由
if next_url:
self.redirect(next_url) #跳转主页路由
else:
self.redirect('/')
else:
self.write({'msg':'login fail'}) #不通过,有问题
class LogoutHandler(AuthBaseHandler):
def get(self, *args, **kwargs):
#self.session.set('username','') #将用户的cookie清除
self.session.delete('username')
self.redirect('/login')
# def post(self,*args,**kwargs):
# self.session.delete('username')
# self.redirect('/login')
class RegisterHandler(AuthBaseHandler):
def get(self, *args, **kwargs):
print('register')
self.render('register.html')
def post(self, *args, **kwargs):
print('registerpost')
username = self.get_argument('username','')
password1 = self.get_argument('password1','')
password2 = self.get_argument('password2','')
if username and password1 and (password1 == password2):
success = add_user(username,password1)
if success:
self.redirect('/login')
else:
self.write({'msg':'register fail'})
else:
print('register again')
self.render('register.html')

View File

@ -0,0 +1,58 @@
import pymysql
# 数据库定义参数
database_ip = "localhost"
database_user = "guest"
database_passwd = "guest1234"
database_name = "GUESTDB"
table_name = "user_info"
# 打开数据库连接
db = pymysql.connect( database_ip, database_user, database_passwd, database_name )
# 使用cursor()方法获取操作游标
cursor = db.cursor()
def DB_Check_byName(user_name):
sql = "SELECT * FROM %s WHERE user_name='%s' " % (table_name,user_name)
try:
# 执行SQL语句
cursor.execute(sql)
# 获取所有记录列表
results = cursor.fetchall()
passwd = results[0][2]
return passwd
except:
print("There is no the user's info !")
return False
def DB_Insert_User(user_info):
user_name = user_info["username"]
user_passwd = user_info["password"]
user_email = user_info["email"]
user_date = user_info["date"]
sql = "INSERT INTO user_info(user_name,user_passwd,user_email,user_register_date) VALUES('%s', '%s', '%s', '%s' )"% (user_name, user_passwd, user_email, user_date)
try:
# 执行sql语句
cursor.execute(sql)
# 执行sql语句
db.commit()
print("Insert user_info successfully!")
return True
except:
# 发生错误时回滚
db.rollback()
print("Insert user_info error!")
return False
# if __name__ == "__main__":
# res = authenticate('user5','1234')
# print("authenticate result: ",res)
# for i in range(10):
# s = str(i)
# res = add_user('user'+s,'1234','user'+s+'@qq.com')
# print("add user", s ," res: ",res)
# res = authenticate('user5','1234')
# print("authenticate result: ",res)

30
Server/handler/main.py Normal file
View File

@ -0,0 +1,30 @@
import tornado.web
from pycket.session import SessionMixin
from bokeh.embed import server_document
from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('template'))
class AuthBaseHandler(tornado.web.RequestHandler,SessionMixin):
def get_current_user(self): #重写get_current_user()方法
return self.session.get('username',None) #session是一种会话状态跟数据库的session可能不一样
#添加装饰器,装饰需要验证的请求
class IndexHandler(AuthBaseHandler):
@tornado.web.authenticated #@tornado.web.authenticated装饰器包裹get方法时表示这个方法只有在用户合法时才会调用authenticated装饰器会调用get_current_user()方法获取current_user的值若值为False则重定向到登录url装饰器判断有没有登录如果没有则跳转到配置的路由下去但是要在app.py里面设置login_url
def get(self,*args,**kwargs):
user = self.get_current_user()
self.render('index.html',user=user)
class Spice_Xyce_Handler(AuthBaseHandler):
@tornado.web.authenticated
def get(self,*args,**kwargs):
template = env.get_template('spice.html')
script = server_document('http://localhost:5006/bkapp')
self.write(template.render(script=script))
# script = server_document('http://localhost:5006/bkapp')
# self.render('spice.html',script=script)

0
Server/handler/spice.py Normal file
View File

0
Server/readme.md Normal file
View File

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

54
Server/spice/app_spice.py Normal file
View File

@ -0,0 +1,54 @@
# 切换 simulation source
# from .sim_xyce import *
from .sim_ngspice import *
from bokeh.plotting import figure
from bokeh import events
from bokeh.server.server import Server
from bokeh.themes import Theme
from bokeh.models import (AutocompleteInput, Button, CheckboxButtonGroup, CheckboxGroup,
ColorPicker, Column, ColumnDataSource, DataTable, DatePicker,
DateRangeSlider, DateSlider, Div, Dropdown, IntEditor,
MultiSelect, NumberEditor, NumberFormatter, Panel, Paragraph,
PreText, RadioButtonGroup, RadioGroup, RangeSlider, Row,
Select, SelectEditor, Slider, Spinner, StringEditor,
StringFormatter, TableColumn, Tabs, TextInput, Toggle,TextAreaInput)
from bokeh.layouts import column, row
from bokeh.models import CustomJS,CustomJSTransform
def bkapp(doc):
def Callback_Button_Submit():
circuit = str(Spice_Input.value)
waveform = Simulation_Spice(circuit)
if waveform != False:
waveform_keys = Waveform_Keys(waveform)
keys = '<p>' + str(waveform_keys) + '</p>'
else:
keys = '<p>Simulation Error !</p>'
keys += '<p>'+ circuit +'</p>'
Div_Result.text = keys
Spice_Input = TextAreaInput(title='SPICE',placeholder="Enter value ...",height=400, width=400,max_length=4000)
Button_Submit = Button(label='Submit', button_type = "success")
Button_Submit.on_click(Callback_Button_Submit)
# Paragraph_Result = Paragraph(text="Waiting for the sim !")
Div_Result = Div(text="<p>Waiting for the sim</p>")
layout_1 = column(Spice_Input,Button_Submit,Div_Result)
layout_top = column(layout_1)
doc.add_root(layout_top)
server = Server({'/bkapp': bkapp},allow_websocket_origin=['localhost:8000','localhost:5006'])
def app_spice_begin():
server.start()
def app_spice_start():
# server.io_loop.add_callback(server.show, "/")
server.io_loop.start()

View File

@ -0,0 +1,18 @@
import PySpice.Logging.Logging as Logging
logger = Logging.setup_logging()
from PySpice.Spice.NgSpice.Shared import NgSpiceShared
def Simulation_Spice(spice_str):
ngspice = NgSpiceShared.new_instance()
try:
ngspice.load_circuit(spice_str)
ngspice.run()
plot_names = ngspice.plot_names
return plot_names
except:
return False
def Waveform_Keys(waveforms):
return waveforms

24
Server/spice/sim_xyce.py Normal file
View File

@ -0,0 +1,24 @@
from PySpice.Spice.Xyce.Server import XyceServer
Xyce_Path = 'D:\\Program Files\\Xyce 7.1 OPENSOURCE\\bin\\Xyce.exe'
spice_server = XyceServer( xyce_command = Xyce_Path )
def Simulation_Spice(spice_str):
try:
raw_file = spice_server(spice_str)
waveforms = raw_file.nodes()
return waveforms
except:
return False
def Waveform_Keys(waveforms):
waveform_keys = []
for i in waveforms:
waveform_keys.append(i.name)
return waveform_keys

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,568 @@
/*--
Author: W3Layouts
Author URL: http://w3layouts.com
License: Creative Commons Attribution 3.0 Unported
License URL: http://creativecommons.org/licenses/by/3.0/
--*/
/*-- Reset-Code --*/
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,dl,dt,dd,ol,nav ul,nav li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline;}
article, aside, details, figcaption, figure,footer, header, hgroup, menu, nav, section {display: block;}
ol,ul{list-style:none;margin:0px;padding:0px;}
blockquote,q{quotes:none;}
blockquote:before,blockquote:after,q:before,q:after{content:'';content:none;}
table{border-collapse:collapse;border-spacing:0;}
a{text-decoration:none;}
.txt-rt{text-align:right;}/* text align right */
.txt-lt{text-align:left;}/* text align left */
.txt-center{text-align:center;}/* text align center */
.float-rt{float:right;}/* float right */
.float-lt{float:left;}/* float left */
.clear{clear:both;}/* clear float */
.pos-relative{position:relative;}/* Position Relative */
.pos-absolute{position:absolute;}/* Position Absolute */
.vertical-base{ vertical-align:baseline;}/* vertical align baseline */
.vertical-top{ vertical-align:top;}/* vertical align top */
nav.vertical ul li{ display:block;}/* vertical menu */
nav.horizontal ul li{ display: inline-block;}/* horizontal menu */
img{max-width:100%;}
body {
padding: 0;
margin: 0;
background: #fff;
min-height: 100vh;
background: linear-gradient(to left, #f5f5f5 50%, #fff 50%);
font-family: 'Raleway', sans-serif;
}
body a {
transition: 0.5s all;
-webkit-transition: 0.5s all;
-moz-transition: 0.5s all;
-o-transition: 0.5s all;
-ms-transition: 0.5s all;
text-decoration: none;
letter-spacing:1px;
font-size:15px;
font-weight:600;
}
body a:hover {
text-decoration: none;
}
body a:focus, a:hover {
text-decoration: none;
}
input[type="button"], input[type="submit"] {
transition: 0.5s all;
-webkit-transition: 0.5s all;
-moz-transition: 0.5s all;
-o-transition: 0.5s all;
-ms-transition: 0.5s all;
}
h1, h2, h3, h4, h5, h6 {
margin: 0;
padding: 0;
font-family: 'Raleway', sans-serif;
font-weight:600;
letter-spacing:1px;
}
.clear{
clear:both;
}
p {
margin: 0;
color:#666;
letter-spacing:1px;
line-height:1.8em;
font-size:16px;
font-weight:400;
}
.row{
margin:0px;
padding:0px;
}
ul {
margin: 0;
padding: 0;
}
label {
margin: 0;
}
a:focus, a:hover {
text-decoration: none;
outline: none;
}
img{
width:100%;
}
/*-- //Reset-Code --*/
.signupform {
padding: 3em 0;
}
.left_grid_info h1 {
font-size: 45px;
margin: 1em 0em .5em 0em;
color: #333;
font-weight: 700;
}
input[type="email"] {
font-size: 15px;
color: #333;
text-align: left;
letter-spacing: 1px;
padding: 14px 10px;
width:93%;
display:inline-block;
box-sizing: border-box;
border: none;
outline: none;
background: transparent;
font-family: 'Raleway', sans-serif;
}
input[type="username"] {
font-size: 15px;
color: #333;
text-align: left;
letter-spacing: 1px;
padding: 14px 10px;
width:93%;
display:inline-block;
box-sizing: border-box;
border: none;
outline: none;
background: transparent;
font-family: 'Raleway', sans-serif;
}
input[type="Password"] {
font-size: 15px;
color: #333;
text-align: left;
text-transform: capitalize;
letter-spacing: 1px;
padding: 14px 10px;
width:93%;
display:inline-block;
box-sizing: border-box;
border: none;
outline: none;
background: transparent;
font-family: 'Raleway', sans-serif;
}
.input-group {
margin-top: 10px;
margin-bottom: 20px;
padding: 3px 10px;
border: 1px solid #ddd;
background: #fff;
}
.btn-block {
background: #ff4040;
border: none;
color: #fff;
font-size: 13px;
padding: 12px 40px;
letter-spacing: 2px;
text-transform: uppercase;
cursor: pointer;
}
.w3_info h2 {
display: inline-block;
font-size: 26px;
margin-bottom: 10px;
color: #333;
letter-spacing: 2px;
text-transform: capitalize;
}
.w3_info h4 {
display: inline-block;
font-size: 15px;
padding: 8px 0px;
color: #444;
text-transform: capitalize;
}
a.btn.btn-block.btn-social.btn-facebook {
display: block;
width: 100%;
padding: 10px 0px;
text-align: center;
font-size: 16px;
font-weight: 600;
letter-spacing: 1px;
font-family: 'Raleway', sans-serif;
}
.w3_info {
flex-basis: 50%;
-webkit-flex-basis: 50%;
box-sizing: border-box;
padding: 3em 4em;
/* -webkit-box-shadow: 1px 0px 15px 0px rgba(0,0,0,0.2);
-moz-box-shadow: 1px 0px 15px 0px rgba(0,0,0,0.2);
box-shadow: 1px 0px 15px 0px rgba(0,0,0,0.2); */
}
.login-check {
position: relative;
}
.w3_info .login-check label{
text-transform: capitalize;
font-size: 13px;
letter-spacing: 1px;
color: #000;
}
.checkbox i {
position: absolute;
top: 0px;
left: 0%;
text-align: center;
display: block;
width: 14px;
height: 14px;
border: 1px solid #777;
outline: none;
border-radius: 0px;
-webkit-border-radius: 0px;
-moz-border-radius: 0px;
-o-border-radius: 0px;
cursor: pointer;
}
.checkbox input:checked + i:after {
opacity: 1;
}
.checkbox input + i:after {
position: absolute;
opacity: 0;
transition: opacity 0.1s;
-o-transition: opacity 0.1s;
-ms-transition: opacity 0.1s;
-moz-transition: opacity 0.1s;
-webkit-transition: opacity 0.1s;
}
.checkbox input + i:after {
content: url(../images/tick.png);
top: 0px;
left: 2px;
}
.checkbox {
position: relative;
display: inline-block;
padding-left: 25px !important;
text-transform: capitalize;
letter-spacing: 1px;
font-size: 14px;
color: #fff;
}
input[type="checkbox" i] {
display: none;
}
.agile_info {
display: -webkit-box; /* OLD - iOS 6-, Safari 3.1-6 */
display: -moz-box; /* OLD - Firefox 19- (buggy but mostly works) */
display: -ms-flexbox; /* TWEENER - IE 10 */
display: -webkit-flex; /* NEW - Chrome */
display: flex; /* NEW, Spec - Opera 12.1, Firefox 20+ */
}
.left_grid_info {
padding-right: 3em;
}
.w3l_form {
padding: 0px;
flex-basis: 50%;
-webkit-flex-basis: 50%;
}
.w3_info p {
padding-bottom: 30px;
}
p.account,p.account1 {
padding-top: 20px;
padding-bottom: 0px;
line-height: 1.5em;
font-size: 13px;
}
p.account a,p.account1 a {
color: #ff4040;
font-size: 11px;
text-decoration: underline;
}
p.account a:hover,p.account1 a:hover {
text-decoration: none;
}
.w3_info label {
margin: 0;
text-transform: uppercase;
letter-spacing: 1px;
font-weight: 500;
color: #000;
margin-bottom: 20px;
font-size: 13px;
padding-left: 0px;
}
h3.w3ls {
margin: 10px 0px;
padding-left: 60px;
}
h3.agileits {
padding-left: 10px;
}
.container {
width: 65%;
margin: 0 auto;
}
.input-group span.fa {
font-size: 16px;
vertical-align: middle;
box-sizing:border-box;
float:left;
text-align: center;
width:6%;
padding: 15px 0px;
color: #01cd74;
}
h5 {
text-align: center;
margin: 10px 0px;
font-size: 15px;
font-weight: 600;
color: #000;
}
.footer p {
color: #666;
text-align: center;
letter-spacing: 1px;
font-size: 15px;
margin-top: 2em;
}
.footer p a {
color: #333;
}
/** Responsive **/
@media screen and (max-width: 1440px){
.container {
width: 70%;
margin: 0 auto;
}
}
@media screen and (max-width: 1366px){
.container {
width: 75%;
}
.left_grid_info h1 {
font-size: 40px;
}
}
@media screen and (max-width: 1080px){
.container {
width: 80%;
}
.w3_info h2 {
font-size: 24px;
letter-spacing: 1px;
}
.left_grid_info h1 {
font-size: 35px;
}
.w3_info {
padding: 3em 3em;
}
}
@media screen and (max-width: 1024px){
.signupform {
padding: 1em 0;
}
.container {
width: 85%;
}
.left_grid_info {
padding-right: 3em;
padding-top: 2em;
}
}
@media screen and (max-width: 991px){
.w3_info h2 {
font-size: 24px;
}
h1 {
font-size: 40px;
letter-spacing: 2px;
}
}
@media screen and (max-width: 900px){
.container {
width: 90%;
}
.left_grid_info h4 {
font-size: 1em;
}
.w3_info {
padding: 3em 2.5em;
}
}
@media screen and (max-width: 800px){
.container {
width: 95%;
}
input[type="text"],input[type="username"],input[type="password"] {
font-size: 14px;
}
.input-group span.fa {
font-size: 16px;
padding: 13px 0px;
}
.w3_info h2 {
font-size: 23px;
}
}
@media screen and (max-width: 768px){
.container {
width: 95%;
}
.w3_info h2 {
letter-spacing: 1px;
}
.left_grid_info h1 {
font-size: 30px;
letter-spacing: 1px;
}
.left_grid_info {
padding-right: 2em;
}
}
@media screen and (max-width: 736px){
.left_grid_info h3 {
font-size: 1.7em;
}
.w3_info h2 {
font-size: 22px;
}
.w3_info {
padding: 3em 2em;
}
.footer p {
font-size: 14px;
}
.w3_info h4 {
font-size: 14px;
}
.footer p {
margin-top: 0em;
margin-bottom: 2em;
}
}
@media screen and (max-width: 684px){
.w3_info h2 {
font-size: 20px;
letter-spacing: 0px;
}
.left_grid_info h1 {
font-size: 26px;
letter-spacing: 1px;
}
}
@media screen and (max-width: 667px){
.container {
width: 80%;
}
}
@media screen and (max-width: 640px){
h1 {
font-size: 37px;
}
.agile_info {
flex-direction: column;
}
body {
background: #FFF;
}
.left_grid_info {
padding-right: 0em;
}
}
@media screen and (max-width: 480px){
.w3l_form {
padding: 0em;
}
h1 {
font-size: 34px;
}
.w3_info {
padding: 3em 1em;
}
.footer {
margin: 0 1em;
}
.left_grid_info h1 {
margin: 0em 0em .5em 0em;
}
}
@media screen and (max-width: 414px){
.w3_info {
padding: 2em;
}
h1 {
font-size: 32px;
letter-spacing: 1px;
}
.left_grid_info p {
font-size: 14px;
}
.container {
width: 90%;
}
.left_grid_info {
padding-top: 1em;
}
.w3_info p {
font-size: 14px;
}
}
@media screen and (max-width: 384px){
.left_grid_info h4 {
font-size: .9em;
}
.w3_info {
padding: 2em 1em;
}
.left_grid_info h1 {
font-size: 21px;
letter-spacing: 0px;
}
.w3_info h2 {
font-size: 18px;
}
}
@media screen and (max-width: 375px){
.left_grid_info h3 {
font-size: 1.5em;
}
}
@media screen and (max-width: 320px){
h1 {
font-size: 25px;
letter-spacing: 1px;
}
.w3_info h2 {
font-size: 18px;
letter-spacing: 0px;
}
.btn-danger {
padding: 13px 12px;
font-size: 13px;
}
input[type="text"], input[type="username"], input[type="password"] {
font-size: 13px;
}
.footer p {
font-size: 13px;
}
.footer p a{
font-size: 13px;
}
}
/** /Responsive **/

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,879 @@
/*--
Author: W3layouts
Author URL: http://w3layouts.com
License: Creative Commons Attribution 3.0 Unported
License URL: http://creativecommons.org/licenses/by/3.0/
--*/
/* reset */
html,
body,
div,
span,
applet,
object,
iframe,
h1,
h2,
h3,
h4,
h5,
h6,
p,
blockquote,
pre,
a,
abbr,
acronym,
address,
big,
cite,
code,
del,
dfn,
em,
img,
ins,
kbd,
q,
s,
samp,
small,
strike,
strong,
sub,
sup,
tt,
var,
b,
u,
i,
dl,
dt,
dd,
ol,
nav ul,
nav li,
fieldset,
form,
label,
legend,
table,
caption,
tbody,
tfoot,
thead,
tr,
th,
td,
article,
aside,
canvas,
details,
embed,
figure,
figcaption,
footer,
header,
hgroup,
menu,
nav,
output,
ruby,
section,
summary,
time,
mark,
audio,
video {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
vertical-align: baseline;
}
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
menu,
nav,
section {
display: block;
}
ol,
ul {
list-style: none;
margin: 0px;
padding: 0px;
}
blockquote,
q {
quotes: none;
}
blockquote:before,
blockquote:after,
q:before,
q:after {
content: '';
content: none;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
/* start editing from here */
a {
text-decoration: none;
}
.txt-rt {
text-align: right;
}
/* text align right */
.txt-lt {
text-align: left;
}
/* text align left */
.txt-center {
text-align: center;
}
/* text align center */
.float-rt {
float: right;
}
/* float right */
.float-lt {
float: left;
}
/* float left */
.clear {
clear: both;
}
/* clear float */
.pos-relative {
position: relative;
}
/* Position Relative */
.pos-absolute {
position: absolute;
}
/* Position Absolute */
.vertical-base {
vertical-align: baseline;
}
/* vertical align baseline */
.vertical-top {
vertical-align: top;
}
/* vertical align top */
nav.vertical ul li {
display: block;
}
/* vertical menu */
nav.horizontal ul li {
display: inline-block;
}
/* horizontal menu */
img {
max-width: 100%;
}
/*end reset*/
html,
body {
padding: 0;
margin: 0;
background: #fff;
font-family: 'Open Sans', sans-serif;
}
body a {
transition: 0.5s all;
-webkit-transition: 0.5s all;
-moz-transition: 0.5s all;
-o-transition: 0.5s all;
-ms-transition: 0.5s all;
text-decoration: none;
}
body a:hover {
text-decoration: none;
}
body a:focus,
a:hover {
text-decoration: none;
}
select,
input[type="email"],
input[type="text"],
input[type=password],
input[type="button"],
input[type="submit"],
textarea {
font-family: 'Open Sans', sans-serif;
transition: 0.5s all;
-webkit-transition: 0.5s all;
-moz-transition: 0.5s all;
-o-transition: 0.5s all;
-ms-transition: 0.5s all;
}
h1,
h2,
h3,
h4,
h5,
h6 {
margin: 0;
padding: 0;
font-family: 'Montserrat', sans-serif;
letter-spacing: 1px;
}
p {
margin: 0;
padding: 0;
letter-spacing: 1px;
font-family: 'Open Sans', sans-serif;
}
ul {
margin: 0;
padding: 0;
}
/*-- //Reset-Code --*/
/*--background --*/
body {
box-sizing: border-box;
background: #ffffff;
min-height: 100vh;
}
.w3layouts-two-grids {
width: 82%;
margin: 0px auto;
}
.mid-class,.main-two-w3ls {
display: -webkit-flex;
display: flex;
-webkit-justify-content: space-between;
justify-content: space-between;
-webkit-flex-wrap: wrap;
flex-wrap:wrap;
}
h1.error {
text-align: center;
color: #000;
text-transform: uppercase;
}
.img-right-side{
text-align: center;
flex-basis: 65%;
-webkit-flex-basis: 65%;
box-sizing: border-box;}
.txt-left-side {
flex-basis: 35%;
-webkit-flex-basis: 35%;
box-sizing: border-box;
text-align: center;
background: #fff;
box-shadow: 0px 0px 10px 1px #cccccc;
}
.img-right-side h3, .txt-left-side h2 {
text-transform:uppercase;
color: #000;
letter-spacing: 0px;
}
.img-right-side p {
font-size: 13.5px;
color: #908c8c;
letter-spacing: 0px;
line-height: 24px;
margin-bottom: 48px;
}
.form-left-to-w3l {
display: flex;
display: -webkit-flex;
border: none;
border-bottom: 1px solid #a5a2a2;
transition: 0.5s all;
-webkit-transition: 0.5s all;
-moz-transition: 0.5s all;
-o-transition: 0.5s all;
-ms-transition: 0.5s all;
}
.form-left-to-w3l input[type="text"],.form-left-to-w3l input[type="email"], .form-left-to-w3l input[type="password"] {
-webkit-flex-basis: 90%;
flex-basis: 90%;
width: 100%;
color: #000;
border: none;
border-left:1px solid #a5a2a2;
outline: none;
-webkit-appearance: none;
background: transparent;
transition: 0.5s all;
-webkit-transition: 0.5s all;
-moz-transition: 0.5s all;
-o-transition: 0.5s all;
-ms-transition: 0.5s all;
box-sizing: border-box;
}
.form-left-to-w3l:hover{border-bottom:1px solid #67e878;}
.form-left-to-w3l:hover span{color:#67e878;}
.form-left-to-w3l:hover.form-left-to-w3l input[type="email"],
.form-left-to-w3l:hover.form-left-to-w3l input[type="password"],
.form-left-to-w3l:hover.form-left-to-w3l input[type="text"]
{ border-left:1px solid #67e878; }
.form-left-to-w3l span {
-webkit-flex-basis: 15%;
flex-basis: 15%;
border: none;
text-align: center;
color: #cccccc;
transition: 0.5s all;
-webkit-transition: 0.5s all;
-moz-transition: 0.5s all;
-o-transition: 0.5s all;
-ms-transition: 0.5s all;
}
button[type=submit] {
background: #67e878;
outline: none;
color: #fff;
font-weight: 600;
border: none;
letter-spacing: 1px;
text-transform: uppercase;
cursor: pointer;
width: 100%;
border-radius: 10px;
transition: 0.5s all;
-webkit-transition: 0.5s all;
-o-transition: 0.5s all;
-moz-transition: 0.5s all;
-ms-transition: 0.5s all;
box-shadow: 0px 0px 8px 0px #60f574;
}
button[type=submit]:hover,a.for:hover,.w3layouts_more-buttn a:hover{opacity:0.8;}
::-webkit-input-placeholder { /* Chrome/Opera/Safari */
color:#b7b6b6;
}
::-moz-placeholder { /* Firefox 19+ */
color:#b7b6b6;
}
:-ms-input-placeholder { /* IE 10+ */
color:#b7b6b6;
}
:-moz-placeholder { /* Firefox 18- */
color:#b7b6b6;
}
input.checked {
position: absolute;
top: 3px;
left:0px;
cursor: pointer;
}
.left-side-forget {
position: relative;
}
.remenber-me, a.for {
color: #757272;
letter-spacing: 0px;
text-transform: capitalize;
}
.remenber-me {
margin-left: 31px;
}
.left-side-forget, .right-side-forget {
flex-basis: 50%;
-webkit-flex-basis: 50%;
text-align: left;
box-sizing: border-box;
}
.w3layouts_more-buttn h3 {
color: #a0a0a0;
letter-spacing: 0px;
font-weight: 800;
}
.w3layouts_more-buttn a {
font-size: 13px;
color: #e80000;
font-weight: bold;
text-decoration: none;
margin-left: 10px;
text-transform: capitalize;
display: inline-block;
letter-spacing: 0px;
outline: none;
}
.copyrigh-wthree {
text-align: center;
}
.copyrigh-wthree p {
color: #000;
}
.copyrigh-wthree p a {
color:#60baaf;
font-size: 14px;
font-weight: 800;
}
/*--responsive--*/
@media(max-width:1920px){
h1.error {
padding-top: 65px;
margin-bottom: 50px;
font-size: 55px;
}
.img-right-side h3, .txt-left-side h2 {
font-size: 25px;
margin-bottom: 37px;
}
.remenber-me, a.for {
font-size: 13px;
}
.img-right-side, .txt-left-side {
padding: 5.5em 5em 3.5em;
}
.form-left-to-w3l input[type="text"], .form-left-to-w3l input[type="email"], .form-left-to-w3l input[type="password"] {
font-size: 16px;
padding-left: 25px;
}
.form-left-to-w3l {
margin: 0px 0px 36px;
padding-bottom: 17px;
}
.form-left-to-w3l span {
font-size: 25px;
}
.w3layouts_more-buttn h3 {
font-size: 15px;
}
.copyrigh-wthree {
padding: 4em 0em 4.5em;
}
}
@media(max-width:1680px){
h1.error {
padding-top: 58px;
margin-bottom: 47px;
font-size: 52px;
}
.img-right-side h3, .txt-left-side h2 {
font-size: 23px;
margin-bottom: 35px;
}
.remenber-me, a.for {
font-size: 12px;
}
.img-right-side, .txt-left-side {
padding: 4.5em 4.5em 3em;
}
.form-left-to-w3l input[type="text"], .form-left-to-w3l input[type="email"], .form-left-to-w3l input[type="password"] {
font-size: 15px;
padding-left: 23px;
}
.form-left-to-w3l {
margin: 0px 0px 35px;
padding-bottom: 15px;
}
.form-left-to-w3l span {
font-size: 23px;
}
.w3layouts_more-buttn h3 {
font-size: 14px;
}
.copyrigh-wthree {
padding: 3.5em 0em 4.5em;
}
}
@media(max-width:1600px){
h1.error {
padding-top: 54px;
margin-bottom: 43px;
letter-spacing: 3px;
font-size: 49px;
}
.img-right-side h3, .txt-left-side h2 {
font-size: 22px;
margin-bottom: 34px;
}
.remenber-me, a.for {
font-size: 11px;
}
.img-right-side, .txt-left-side {
padding: 3.5em 4em 2.5em;
}
.form-left-to-w3l input[type="text"], .form-left-to-w3l input[type="email"], .form-left-to-w3l input[type="password"] {
font-size: 14px;
padding-left: 20px;
}
.form-left-to-w3l {
margin: 0px 0px 33px;
padding-bottom: 14px;
}
.form-left-to-w3l span {
font-size: 21px;
}
.w3layouts_more-buttn h3 {
font-size: 13px;
}
.copyrigh-wthree p {
font-size: 14px;
letter-spacing: 3px;
}
.copyrigh-wthree {
padding: 3em 0em 4.5em;
}
button[type=submit] {
font-size: 15px;
padding: 19px 20px;
margin: 53px 0px;
}
.right-side-forget {
text-align: right;
}
}
@media(max-width:1440px){
h1.error {
padding-top: 51px;
margin-bottom: 41px;
font-size: 47px;
}
.img-right-side h3, .txt-left-side h2 {
font-size: 21px;
}
.img-right-side, .txt-left-side {
padding: 3em 3.5em 2.3em;
}
.w3layouts-two-grids {
width: 85%;
}
button[type=submit] {
padding: 17px 20px;
}
}
@media(max-width:1366px){
.form-left-to-w3l {
margin: 0px 0px 30px;
padding-bottom: 13px;
}
.img-right-side h3, .txt-left-side h2 {
margin-bottom: 29px;
}
button[type=submit] {
margin: 50px 0px;
}
}
@media(max-width:1280px){
h1.error {
padding-top: 49px;
margin-bottom: 38px;
font-size: 43px;
}
.img-right-side, .txt-left-side {
padding: 2.5em 3em 2.3em;
}
.w3layouts-two-grids {
width: 88%;
}
.form-left-to-w3l span {
font-size: 18px;
}
.form-left-to-w3l input[type="text"],
.form-left-to-w3l input[type="email"],
.form-left-to-w3l input[type="password"] {
padding-left: 16px;
}
button[type=submit] {
margin: 47px 0px;
}
.img-right-side p {
margin-bottom: 39px;
}
}
@media(max-width:1080px){
.copyrigh-wthree p {
letter-spacing: 2px;
}
.img-right-side, .txt-left-side {
padding: 2.5em 2.5em 2em;
}
.form-left-to-w3l {
margin: 0px 0px 26px;
}
.w3layouts-two-grids {
width: 92%;
}
.copyrigh-wthree {
padding: 2.5em 0em 4em;
}
h1.error {
font-size: 41px;
}
.img-right-side h3, .txt-left-side h2 {
margin-bottom: 27px;
}
}
@media(max-width:1050px){
.img-right-side h3, .txt-left-side h2 {
font-size: 20px;
}
.img-right-side p {
margin-bottom: 33px;
}
.remenber-me, a.for {
font-size: 11px;
}
.w3layouts_more-buttn h3 {
font-size: 12px;
}
.w3layouts_more-buttn a {
font-size: 12px;
}
}
@media(max-width:1024px){
.mid-class {
flex-direction: column;
}
.w3layouts-two-grids {
width: 51%;
}
h1.error {
padding-top: 47px;
margin-bottom: 9px;
}
.form-left-to-w3l {
margin: 0px 0px 24px;
padding-bottom: 11px;
}
button[type=submit] {
margin: 42px 0px;
}
}
@media(max-width:991px){
h1.error {
font-size: 38px;
}
.img-right-side, .txt-left-side {
padding: 2.3em 2.2em 1.8em;
}
button[type=submit] {
padding: 14px 20px;
}
}
@media(max-width:900px){
h1.error {
padding-top: 45px;
}
.form-left-to-w3l span {
font-size: 16px;
}
.form-left-to-w3l input[type="text"], .form-left-to-w3l input[type="email"], .form-left-to-w3l input[type="password"] {
padding-left: 14px;
}
button[type=submit] {
margin: 39px 0px;
}
}
@media(max-width:800px){
.w3layouts-two-grids {
width: 58%;
}
.img-right-side, .txt-left-side {
padding: 2em 2em 1.6em;
}
}
@media(max-width:768px){
.w3layouts-two-grids {
width: 61%;
}
button[type=submit] {
font-size: 14px;
}
.copyrigh-wthree p {
letter-spacing: 1px;
}
}
@media(max-width:767px){
h1.error {
font-size: 36px;
letter-spacing: 2px;
}
.img-right-side h3, .txt-left-side h2 {
margin-bottom: 23px;
}
}
@media(max-width:736px){
.w3layouts-two-grids {
width: 64%;
}
.img-right-side p {
margin-bottom: 31px;
}
.form-left-to-w3l {
margin: 0px 0px 21px;
}
}
@media(max-width:667px){
.w3layouts-two-grids {
width: 69%;
}
h1.error {
padding-top: 42px;
}
}
@media(max-width:640px){
.w3layouts-two-grids {
width: 72%;
}
h1.error {
font-size: 34px;
}
button[type=submit] {
margin: 36px 0px;
}
}
@media(max-width:600px){
.w3layouts-two-grids {
width: 78%;
}
button[type=submit] {
padding: 12px 20px;
font-size: 13px;
}
}
@media(max-width:568px){
.w3layouts-two-grids {
width: 81%;
}
.img-right-side, .txt-left-side {
padding: 1.8em 1.8em 1.4em;
}
.form-left-to-w3l {
padding-bottom: 9px;
}
}
@media(max-width:480px){
h1.error {
font-size: 30px;
padding-top: 38px;
}
.w3layouts-two-grids {
width: 94%;
}
.img-right-side h3, .txt-left-side h2 {
font-size: 19px;
}
}
@media(max-width:440px){
h1.error {
font-size: 27px;
padding-top: 35px;
letter-spacing: 1px;
}
.copyrigh-wthree p a {
line-height: 35px;
}
}
@media(max-width:414px){
button[type=submit] {
margin: 29px 0px;
}
.form-left-to-w3l {
margin: 0px 0px 21px;
}
}
@media(max-width:384px){
h1.error {
font-size: 24px;
}
.img-right-side, .txt-left-side {
padding: 1.5em 1.5em 1.4em;
}
}
@media(max-width:375px){
.form-left-to-w3l {
margin: 0px 0px 19px;
padding-bottom: 7px;
}
h1.error {
font-size: 22px;
}
}
@media(max-width:320px){
.img-right-side h3, .txt-left-side h2 {
font-size: 17px;
}
h1.error {
letter-spacing: 0px;
font-size: 21px;
}
.form-left-to-w3l input[type="text"], .form-left-to-w3l input[type="email"], .form-left-to-w3l input[type="password"] {
font-size: 13px;
}
/*--//responsive--*/

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 434 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

View File

@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Hello, World !</title>
</head>
<body>
<h1>我的第一个标题</h1>
<p>我的第一个段落。</p>
<p>当前用户 {{user}} </p>
<form action="/spice" method="get">
<div><input type="submit" value="spice"></div>
</form>
<form action="/logout" method="get">
<div><input type="submit" value="退出"></div>
</form>
</body>
</html>

View File

@ -0,0 +1,83 @@
<!--
Author: W3layouts
Author URL: http://w3layouts.com
License: Creative Commons Attribution 3.0 Unported
License URL: http://creativecommons.org/licenses/by/3.0/
-->
<!DOCTYPE html>
<html lang="en">
<head>
<title>Business Login Form Responsive Widget Template :: w3layouts</title>
<!-- Meta-Tags -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="utf-8">
<meta name="keywords" content="Business Login Form a Responsive Web Template, Bootstrap Web Templates, Flat Web Templates, Android Compatible Web Template, Smartphone Compatible Web Template, Free Webdesigns for Nokia, Samsung, LG, Sony Ericsson, Motorola Web Design">
<script>
addEventListener("load", function () {
setTimeout(hideURLbar, 0);
}, false);
function hideURLbar() {
window.scrollTo(0, 1);
}
</script>
<!-- //Meta-Tags -->
<!-- css files -->
<link href="static/login/css/font-awesome.min.css" rel="stylesheet" type="text/css" media="all">
<link href="static/login/css/style.css" rel="stylesheet" type="text/css" media="all"/>
<!-- //css files -->
<!-- google fonts -->
<link href="//fonts.googleapis.com/css?family=Raleway:100,100i,200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,800,800i,900,900i" rel="stylesheet">
<!-- //google fonts -->
</head>
<body>
<div class="signupform">
<div class="container">
<!-- main content -->
<div class="agile_info">
<div class="w3l_form">
<div class="left_grid_info">
<h1>Manage Your Business Account</h1>
<p>Donec dictum nisl nec mi lacinia, sed maximus tellus eleifend. Proin molestie cursus sapien ac eleifend.</p>
<img src="static/login/images/image_login_1.jpg" alt="" />
</div>
</div>
<div class="w3_info">
<h2>Login to your Account</h2>
<p>Enter your details to login.</p>
<form action="/login" method="post">
<label>User Name</label>
<div class="input-group">
<span class="fa fa-user" aria-hidden="true"></span>
<input type="username" placeholder="User Name" name="username" required="">
</div>
<label>Password</label>
<div class="input-group">
<span class="fa fa-lock" aria-hidden="true"></span>
<input type="Password" placeholder="Enter Password" name="password" required="">
</div>
<!--
<div class="login-check">
<label class="checkbox"><input type="checkbox" name="checkbox" checked=""><i> </i> Remember me</label>
</div>-->
<button class="btn btn-danger btn-block" type="submit">Login</button >
</form>
<!--<p class="account">By clicking login, you agree to our <a href="#">Terms & Conditions!</a></p>-->
<p class="account1">Dont have an account? <a href="register">Register here</a></p>
</div>
</div>
<!-- //main content -->
</div>
<!-- footer -->
<div class="footer">
<p>&copy; 2019 Business login form. All Rights Reserved | Design by <a href="https://w3layouts.com/" target="blank">W3layouts</a></p>
</div>
<!-- footer -->
</div>
</body>
</html>

View File

@ -0,0 +1,112 @@
<!--A Design by W3layouts
Author: W3layout
Author URL: http://w3layouts.com
License: Creative Commons Attribution 3.0 Unported
License URL: http://creativecommons.org/licenses/by/3.0/
-->
<!DOCTYPE html>
<html lang="en">
<head>
<title>Gadget Sign Up Form a Flat Responsive Widget Template :: w3layouts </title>
<!-- Meta tags -->
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="keywords" content="Gadget Sign Up Form Responsive Widget, Audio and Video players, Login Form Web Template, Flat Pricing Tables, Flat Drop-Downs, Sign-Up Web Templates, Flat Web Templates, Login Sign-up Responsive Web Template, Smartphone Compatible Web Template, Free Web Designs for Nokia, Samsung, LG, Sony Ericsson, Motorola Web Design"
/>
<script>
addEventListener("load", function () { setTimeout(hideURLbar, 0); }, false); function hideURLbar() { window.scrollTo(0, 1); }
</script>
<!-- Meta tags -->
<!-- font-awesome icons -->
<link href="static/register/css/font-awesome.min.css" rel="stylesheet">
<!-- //font-awesome icons -->
<!--stylesheets-->
<link href="static/register/css/style.css" rel='stylesheet' type='text/css' media="all">
<!--//style sheet end here-->
<link href="//fonts.googleapis.com/css?family=Montserrat:300,400,500,600" rel="stylesheet">
<link href="//fonts.googleapis.com/css?family=Open+Sans:400,600,700" rel="stylesheet">
</head>
<body>
<h1 class="error">Gadget Sign Up Form</h1>
<!---728x90--->
<div class="w3layouts-two-grids">
<!---728x90--->
<div class="mid-class">
<div class="img-right-side">
<h3>Manage Your Gadgets Account</h3>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget Lorem ipsum dolor sit
amet, consectetuer adipiscing elit. Aenean commodo ligula ege</p>
<img src="static/register/images/image_register_1.png" class="img-fluid" alt="">
</div>
<div class="txt-left-side">
<h2> Sign Up Here </h2>
<form action="#" method="post">
<div class="form-left-to-w3l">
<span class="fa fa-user-o" aria-hidden="true"></span>
<input type="text" name="username" placeholder=" Name" required="">
<div class="clear"></div>
</div>
<!--
<div class="form-left-to-w3l">
<span class="fa fa-phone" aria-hidden="true"></span>
<input type="text" name="phone" placeholder="Phone" required="">
<div class="clear"></div>
</div>-->
<div class="form-left-to-w3l">
<span class="fa fa-envelope-o" aria-hidden="true"></span>
<input type="email" name="email" placeholder="Email" required="">
<div class="clear"></div>
</div>
<div class="form-left-to-w3l ">
<span class="fa fa-lock" aria-hidden="true"></span>
<input type="password" name="password1" placeholder="Password" required="">
<div class="clear"></div>
</div>
<div class="form-left-to-w3l ">
<span class="fa fa-lock" aria-hidden="true"></span>
<input type="password" name="password2" placeholder="Password confirms" required="">
<div class="clear"></div>
</div>
<!--
<div class="main-two-w3ls">
<div class="left-side-forget">
<input type="checkbox" class="checked">
<span class="remenber-me">Remember me </span>
</div>
<div class="right-side-forget">
<a href="#" class="for">Forgot password...?</a>
</div>
</div>
-->
<div class="btnn">
<button type="submit">Sign Up </button>
</div>
</form>
<div class="w3layouts_more-buttn">
<h3>Already have an account ?
<a href="/login">Login Here
</a>
</h3>
</div>
<div class="clear"></div>
</div>
</div>
</div>
<!---728x90--->
<footer class="copyrigh-wthree">
<p>
© 2019 Gadget Sign Up Form. All Rights Reserved | Design by
<a href="http://www.W3Layouts.com" target="_blank">W3Layouts</a>
</p>
</footer>
</body>
</html>

View File

@ -0,0 +1,20 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Embedding a Bokeh Server With </title>
</head>
<body>
<div>
This Bokeh app below served by a Bokeh server that has been embedded
in another web app framework. For more information see the section
<a target="_blank" href="https://docs.bokeh.org/en/latest/docs/user_guide/server.html#embedding-bokeh-server-as-a-library">Embedding Bokeh Server as a Library</a>
in the User's Guide.
</div>
<div>
{{ script|safe }}
</div>
</body>
</html>

0
requirements Normal file
View File