Python全栈开辟

By admin in 澳门新葡亰官网app on 2019年5月7日

代码如下:

Python的Bottle框架中回到静态文件和JSON对象的法子,

代码如下:

# -*- coding: utf-8 -*-
#!/usr/bin/python
# filename: todo.py
# codedtime: 2014-8-28 20:50:44

import sqlite3
import bottle

@bottle.route('/help3')
def help():
  return bottle.static_file('help.html', root='.') #静态文件

@bottle.route('/json:json#[0-9]+#')
def show_json(json):
  conn = sqlite3.connect('todo.db')
  c = conn.cursor()
  c.execute("SELECT task FROM todo WHERE id LIKE ?", (json))
  result = c.fetchall()
  c.close()

  if not result:
    return {'task':'This item number does not exist!'}
  else:
    return {'Task': result[0]} #返回Json对象

bottle.debug(True)
bottle.run(host='127.0.0.1', port=8080, reloader = True)

 第二个路由@bottle.route(‘/help叁’)
重回3个静态问,在浏览器中输入:

结果如下:

图片 1

内部的 root=’.’)或
root=’./’)表示在先后当前目录下,当然你也得以驾驭其余的门径如:
root=’/path/to/file’

第三个路由@bottle.route(‘/json:json#[0-9]+#’)重临多少个Json对象,在浏览器中输入:

结果如下:

图片 2

Web程序难免会遇到访问退步的谬误,那么怎么着去捕获那些不当,Bottle能够用路由体制来捕捉错误,如下捕获403、40四:

@error(403)
def mistake403(code):
  return 'The parameter you passed has the wrong format!'

@error(404)
def mistake404(code):
  return 'Sorry, this page does not exist!'

任何错误管理一成不改变!

代码如下: # -*- coding: utf-8 -*-#!/usr/bin/python# filename:
todo.py# codedtime: 2014-8-28 20:50:44import…

Python的WEB框架

# -*- coding: utf-8 -*-
#!/usr/bin/python
# filename: todo.py
# codedtime: 2014-8-28 20:50:44

import sqlite3
import bottle

@bottle.route('/help3')
def help():
  return bottle.static_file('help.html', root='.') #静态文件

@bottle.route('/json:json#[0-9]+#')
def show_json(json):
  conn = sqlite3.connect('todo.db')
  c = conn.cursor()
  c.execute("SELECT task FROM todo WHERE id LIKE ?", (json))
  result = c.fetchall()
  c.close()

  if not result:
    return {'task':'This item number does not exist!'}
  else:
    return {'Task': result[0]} #返回Json对象

bottle.debug(True)
bottle.run(host='127.0.0.1', port=8080, reloader = True)

Bottle

Bottle是一个高速、简洁、轻量级的依靠WSIG的袖珍Web框架,此框架只由2个.py 文件,除了Python的正统库外,其不依赖任何别的模块。

1
2
3
4
pip install bottle
easy_install bottle
apt-get install python-bottle
wget http://bottlepy.org/bottle.py

Bottle框架大概能够分成以下一些:

  • 路由系统,将不一样请求交由钦定函数管理
  • 模板系统,将模板中的特殊语法渲染成字符串,值得提的是Bottle的模版引擎能够随便钦点:Bottle内置模板、mako、jinja2、cheetah
  • 集体组件,用于提供管理请求相关的消息,如:表单数据、cookies、请求头等
  • 劳动,Bottle暗许帮助多样根据WSGI的服务,如:

 

server_names = {
    'cgi': CGIServer,
    'flup': FlupFCGIServer,
    'wsgiref': WSGIRefServer,
    'waitress': WaitressServer,
    'cherrypy': CherryPyServer,
    'paste': PasteServer,
    'fapws3': FapwsServer,
    'tornado': TornadoServer,
    'gae': AppEngineServer,
    'twisted': TwistedServer,
    'diesel': DieselServer,
    'meinheld': MeinheldServer,
    'gunicorn': GunicornServer,
    'eventlet': EventletServer,
    'gevent': GeventServer,
    'geventSocketIO':GeventSocketIOServer,
    'rocket': RocketServer,
    'bjoern' : BjoernServer,
    'auto': AutoServer,
}

 

框架的大旨使用

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from bottle import template, Bottle
root = Bottle()
 
@root.route('/hello/')
def index():
    return "Hello World"
    # return template('<b>Hello {{name}}</b>!', name="Alex")
 
root.run(host='localhost', port=8080)

一、路由系统

路由系统是的url对应钦定函数,当用户请求有些url时,就由钦命函数处理当下恳请,对于Bottle的路由系统能够分成一下几类:

  • 静态路由
  • 动态路由
  • 伸手方法路由
  • 二级路由

壹、静态路由

1
2
3
@root.route('/hello/')
def index():
    return template('<b>Hello {{name}}</b>!', name="Alex")

2、动态路由

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@root.route('/wiki/<pagename>')
def callback(pagename):
    ...
 
@root.route('/object/<id:int>')
def callback(id):
    ...
 
@root.route('/show/<name:re:[a-z]+>')
def callback(name):
    ...
 
@root.route('/static/<path:path>')
def callback(path):
    return static_file(path, root='static')

3、请求方法路由

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@root.route('/hello/', method='POST')
def index():
    ...
 
@root.get('/hello/')
def index():
    ...
 
@root.post('/hello/')
def index():
    ...
 
@root.put('/hello/')
def index():
    ...
 
@root.delete('/hello/')
def index():
    ...

四、二级路由

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from bottle import template, Bottle

app01 = Bottle()

@app01.route('/hello/', method='GET')
def index():
    return template('<b>App01</b>!')

app01.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from bottle import template, Bottle

app02 = Bottle()


@app02.route('/hello/', method='GET')
def index():
    return template('<b>App02</b>!')

app02.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from bottle import template, Bottle
from bottle import static_file
root = Bottle()
 
@root.route('/hello/')
def index():
    return template('<b>Root {{name}}</b>!', name="Alex")
 
from framwork_bottle import app01
from framwork_bottle import app02
 
root.mount('app01', app01.app01)
root.mount('app02', app02.app02)
 
root.run(host='localhost', port=8080)

贰、模板系统

模板系统用于将Html和自定的值两者举办渲染,从而获得字符串,然后将该字符串重临给客户端。大家明白在Bottle中得以接纳内置模板系统、mako、jinja2、cheetah等,以放权模板系统为例:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <h1>{{name}}</h1>
</body>
</html>

hello_template.tpl
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from bottle import template, Bottle
root = Bottle()
 
@root.route('/hello/')
def index():
    # 默认情况下去目录:['./', './views/']中寻找模板文件 hello_template.html
    # 配置在 bottle.TEMPLATE_PATH 中
    return template('hello_template.tpl', name='alex')
 
root.run(host='localhost', port=8080)

1、语法

  • 单值
  • 单行Python代码
  • Python代码快
  • Python、Html混合

 

<h1>1、单值</h1>
{{name}}

<h1>2、单行Python代码</h1>
% s1 = "hello"


<h1>3、Python代码块</h1>
<%
    # A block of python code
    name = name.title().strip()
    if name == "Alex":
        name="seven"
%>


<h1>4、Python、Html混合</h1>

% if True:
    {{name}}
% end
<ul>
  % for item in name:
    <li>{{item}}</li>
  % end
</ul>

 

2、函数 

include(sub_template, **variables)

1
2
3
4
5
# 导入其他模板文件
 
% include('header.tpl', title='Page Title')
Page Content
% include('footer.tpl')

rebase(name, **variables)

<html>
<head>
  <title>{{title or 'No title'}}</title>
</head>
<body>
  {{!base}}
</body>
</html>

base.tpl
1
2
3
4
# 导入母版
 
% rebase('base.tpl', title='Page Title')
<p>Page Content ...</p>

defined(name)

1
# 检查当前变量是否已经被定义,已定义True,未定义False

get(name, default=None)

1
# 获取某个变量的值,不存在时可设置默认值

setdefault(name, default)

1
# 如果变量不存在时,为变量设置默认值

扩充:自定义函数

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <h1>自定义函数</h1>
    {{ wupeiqi() }}

</body>
</html>

hello_template.tpl

图片 3 hello_template.tpl

图片 4 main.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from bottle import template, Bottle,SimpleTemplate
root = Bottle()


def custom():
    return '123123'


@root.route('/hello/')
def index():
    # 默认情况下去目录:['./', './views/']中寻找模板文件 hello_template.html
    # 配置在 bottle.TEMPLATE_PATH 中
    return template('hello_template.html', name='alex', wupeiqi=custom)

root.run(host='localhost', port=8080)

main.py

注:变量或函数前增多 【 ! 】,则会停业转义的法力

3、公共组件

由于Web框架就是用来【接收用户请求】-> 【管理用户请求】->
【响应相关内容】,对于具体怎么管理用户请求,开发人士依据用户请求来进展拍卖,而对此收到用户请求和对应相关的内容均交由框架自个儿来拍卖,其管理完了之后将应时而生交给开垦人士和用户。

【接收用户请求】

当框架接收到用户请求之后,将呼吁音讯封装在Bottle的request中,以供开拓职员使用

【响应相关内容】

当开采职员的代码管理完用户请求之后,会将其施行内容相应给用户,相应的内容会封装在Bottle的response中,然后再由框架将内容重临给用户

从而,公共组件本质实际上便是为开采人士提供接口,使其能够拿走用户消息并安排响应内容。

1、request

Bottle中的request其实是三个LocalReqeust对象,个中封装了用户请求的连锁音信:

request.headers
    请求头信息

request.query
    get请求信息

request.forms
    post请求信息

request.files
    上传文件信息

request.params
    get和post请求信息

request.GET
    get请求信息

request.POST
    post和上传信息

request.cookies
    cookie信息

request.environ
    环境相关相关

2、response

Bottle中的request其实是一个LocalResponse对象,在那之中框架将要再次来到给用户的连带音信:

response
    response.status_line
        状态行

    response.status_code
        状态码

    response.headers
        响应头

    response.charset
        编码

    response.set_cookie
        在浏览器上设置cookie

    response.delete_cookie
        在浏览器上删除cookie

实例:

from bottle import route, request

@route('/login')
def login():
    return '''
        <form action="/login" method="post">
            Username: <input name="username" type="text" />
            Password: <input name="password" type="password" />
            <input value="Login" type="submit" />
        </form>
    '''

@route('/login', method='POST')
def do_login():
    username = request.forms.get('username')
    password = request.forms.get('password')
    if check_login(username, password):
        return "<p>Your login information was correct.</p>"
    else:
        return "<p>Login failed.</p>"

基本Form请求

图片 5 基本Form请求

图片 6 上传文件 

<form action="/upload" method="post" enctype="multipart/form-data">
  Category:      <input type="text" name="category" />
  Select a file: <input type="file" name="upload" />
  <input type="submit" value="Start upload" />
</form>


@route('/upload', method='POST')
def do_upload():
    category   = request.forms.get('category')
    upload     = request.files.get('upload')
    name, ext = os.path.splitext(upload.filename)
    if ext not in ('.png','.jpg','.jpeg'):
        return 'File extension not allowed.'

    save_path = get_save_path_for_category(category)
    upload.save(save_path) # appends upload.filename automatically
    return 'OK'

上传文件

四、服务

对于Bottle框架其自壬申落到实处类似于Tornado本身根据socket实现Web服务,所以必须依据WSGI,私下认可Bottle已经落到实处并且协理的WSGI有:

图片 7 WSGI

server_names = {
    'cgi': CGIServer,
    'flup': FlupFCGIServer,
    'wsgiref': WSGIRefServer,
    'waitress': WaitressServer,
    'cherrypy': CherryPyServer,
    'paste': PasteServer,
    'fapws3': FapwsServer,
    'tornado': TornadoServer,
    'gae': AppEngineServer,
    'twisted': TwistedServer,
    'diesel': DieselServer,
    'meinheld': MeinheldServer,
    'gunicorn': GunicornServer,
    'eventlet': EventletServer,
    'gevent': GeventServer,
    'geventSocketIO':GeventSocketIOServer,
    'rocket': RocketServer,
    'bjoern' : BjoernServer,
    'auto': AutoServer,
}

WSGI

利用时,只需在主app实施run方法时内定参数就可以:

1
2
3
4
5
6
7
8
9
10
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from bottle import Bottle
root = Bottle()
 
@root.route('/hello/')
def index():
    return "Hello World"
# 默认server ='wsgiref'
root.run(host='localhost', port=8080, server='wsgiref')

暗中同意server=”wsgiref”,即:使用Python内置模块wsgiref,假若想要使用任何时,则必要首先安装相关类库,然后手艺运用。如:

图片 8 bottle.py源码

# 如果使用Tornado的服务,则需要首先安装tornado才能使用

class TornadoServer(ServerAdapter):
    """ The super hyped asynchronous server by facebook. Untested. """
    def run(self, handler): # pragma: no cover
        # 导入Tornado相关模块
        import tornado.wsgi, tornado.httpserver, tornado.ioloop
        container = tornado.wsgi.WSGIContainer(handler)
        server = tornado.httpserver.HTTPServer(container)
        server.listen(port=self.port,address=self.host)
        tornado.ioloop.IOLoop.instance().start()

bottle.py源码

PS:以上WSGI中提供了1九种,如若想要使期协理任何服务,则须要扩张Bottle源码来自定义1个ServerAdapter

越来越多参见:

 第二个路由@bottle.route(‘/help叁’)
重返二个静态问,在浏览器中输入:

Flask 

Flask是一个基于Python开采并且重视jinja2模板和Werkzeug
WSGI服务的七个袖珍框架,对于Werkzeug本质是Socket服务端,其用来收纳http请求并对请求实行预管理,然后触发Flask框架,开荒人士基于Flask框架提供的意义对请求进行相应的拍卖,并回到给用户,借使要回去给用户复杂的内容时,供给借助jinja2模板来落到实处对模板的拍卖,即:将模板和数据开始展览渲染,将渲染后的字符串再次来到给用户浏览器。

“微”(micro) 并不表示你须要把全路 Web 应用塞进单个 Python
文件(纵然真正能够 ),也不意味 Flask
在功能上享有欠缺。微框架中的“微”意味着 Flask
意在保证基本简单而易于扩张。Flask
不会替你做出太多决策——举例选择何种数据库。而那叁个 Flask
所选择的——举个例子动用何种模板引擎——则很轻松替换。除外的整整都由可由你明白。如此,Flask
能够与您相辅相成。

暗许境况下,Flask
不含有数据库抽象层、表单验证,或是别的任何已有两种库能够胜任的效应。但是,Flask
帮助用扩充来给使用增多这么些功能,仿佛是 Flask
自个儿完结的一模一样。众多的庞大提供了数据库集成、表单验证、上传处理、多姿多彩的盛开认证本事等效果。Flask
只怕是“微小”的,但它已计划还好需求繁杂的生产条件中投入使用。

安装

1
pip install Flask

图片 9 werkzeug

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from werkzeug.wrappers import Request, Response

@Request.application
def hello(request):
    return Response('Hello World!')

if __name__ == '__main__':
    from werkzeug.serving import run_simple
    run_simple('localhost', 4000, hello)

werkzeug

一、第一次

1
2
3
4
5
6
7
8
9
from flask import Flask
app = Flask(__name__)
 
@app.route("/")
def hello():
    return "Hello World!"
 
if __name__ == "__main__":
    app.run()

二、路由系统

  • @app.route(‘/user/<username>’)
  • @app.route(‘/post/<int:post_id>’)
  • @app.route(‘/post/<float:post_id>’)
  • @app.route(‘/post/<path:path>’)
  • @app.route(‘/login’, methods=[‘GET’, ‘POST’])

常用路由系统有以上多样,全体的路由系统都是基于一下对应涉及来拍卖:

1
2
3
4
5
6
7
8
9
DEFAULT_CONVERTERS = {
    'default':          UnicodeConverter,
    'string':           UnicodeConverter,
    'any':              AnyConverter,
    'path':             PathConverter,
    'int':              IntegerConverter,
    'float':            FloatConverter,
    'uuid':             UUIDConverter,
}

注:对于Flask私下认可不支持直接写正则表明式的路由,但是能够因此自定义来完毕,见:

三、模板

一、模板的使用

Flask使用的是Jinja二模板,所以其语法和Django无差距

2、自定义模板方法

Flask中自定义模板方法的点子和Bottle相似,创制贰个函数并透过参数的款型传播render_template,如:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <h1>自定义函数</h1>
    {{ww()|safe}}

</body>
</html>

index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from flask import Flask,render_template
app = Flask(__name__)
 
 
def wupeiqi():
    return '<h1>Wupeiqi</h1>'
 
@app.route('/login', methods=['GET''POST'])
def login():
    return render_template('login.html', ww=wupeiqi)
 
app.run()

四、公共组件

1、请求

对此Http请求,Flask会讲请求音讯封装在request中(werkzeug.wrappers.BaseRequest),提供的如下常用方法和字段以供役使:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
request.method
request.args
request.form
request.values
request.files
request.cookies
request.headers
request.path
request.full_path
request.script_root
request.url
request.base_url
request.url_root
request.host_url
request.host

图片 10 表单管理德姆o

图片 11 上传文件Demo

图片 12 Cookie操作

@app.route('/login', methods=['POST', 'GET'])
def login():
    error = None
    if request.method == 'POST':
        if valid_login(request.form['username'],
                       request.form['password']):
            return log_the_user_in(request.form['username'])
        else:
            error = 'Invalid username/password'
    # the code below is executed if the request method
    # was GET or the credentials were invalid
    return render_template('login.html', error=error)

表单处理Demo

from flask import request
from werkzeug import secure_filename

@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        f = request.files['the_file']
        f.save('/var/www/uploads/' + secure_filename(f.filename))
    ...

上传文件Demo

from flask import request

@app.route('/setcookie/')
def index():
    username = request.cookies.get('username')
    # use cookies.get(key) instead of cookies[key] to not get a
    # KeyError if the cookie is missing.




from flask import make_response

@app.route('/getcookie')
def index():
    resp = make_response(render_template(...))
    resp.set_cookie('username', 'the username')
    return resp

Cookie操作

2、响应

当用户请求被开拓职员的逻辑管理到位之后,会将结果发送给用户浏览器,那么就需求对请求做出相应的响应。

a.字符串

1
2
3
@app.route('/index/', methods=['GET''POST'])
def index():
    return "index"

b.模板引擎

1
2
3
4
5
6
7
8
from flask import Flask,render_template,request
app = Flask(__name__)
 
@app.route('/index/', methods=['GET''POST'])
def index():
    return render_template("index.html")
 
app.run()

c.重定向

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from flask import Flask, redirect, url_for
app = Flask(__name__)
 
@app.route('/index/', methods=['GET''POST'])
def index():
    # return redirect('/login/')
    return redirect(url_for('login'))
 
@app.route('/login/', methods=['GET''POST'])
def login():
    return "LOGIN"
 
app.run()

d.错误页面

from flask import Flask, abort, render_template
app = Flask(__name__)

@app.route('/e1/', methods=['GET', 'POST'])
def index():
    abort(404, 'Nothing')
app.run()

指定URL,简单错误
1
2
3
4
5
6
7
8
9
10
11
12
from flask import Flask, abort, render_template
app = Flask(__name__)
 
@app.route('/index/', methods=['GET''POST'])
def index():
    return "OK"
 
@app.errorhandler(404)
def page_not_found(error):
    return render_template('page_not_found.html'), 404
 
app.run()

e.设置相应信息

使用make_response能够对相应的剧情开始展览操作

1
2
3
4
5
6
7
8
9
10
11
12
13
from flask import Flask, abort, render_template,make_response
app = Flask(__name__)
 
@app.route('/index/', methods=['GET''POST'])
def index():
    response = make_response(render_template('index.html'))
    # response是flask.wrappers.Response类型
    # response.delete_cookie
    # response.set_cookie
    # response.headers['X-Something'] = 'A value'
    return response
 
app.run()

3、Session

除请求对象之外,还有1个 session
对象。它同意你在差别请求间存款和储蓄特定用户的音信。它是在 库克ies
的根底上达成的,并且对 Cookies
进行密钥具名要接纳会话,你供给设置三个密钥。

  • 设置:session[‘username’] = ‘xxx’

  • 删除:session.pop(‘username’, None)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from flask import Flask, session, redirect, url_for, escape, request
 
app = Flask(__name__)
 
@app.route('/')
def index():
    if 'username' in session:
        return 'Logged in as %s' % escape(session['username'])
    return 'You are not logged in'
 
@app.route('/login', methods=['GET''POST'])
def login():
    if request.method == 'POST':
        session['username'= request.form['username']
        return redirect(url_for('index'))
    return '''
        <form action="" method="post">
            <p><input type=text name=username>
            <p><input type=submit value=Login>
        </form>
    '''
 
@app.route('/logout')
def logout():
    # remove the username from the session if it's there
    session.pop('username'None)
    return redirect(url_for('index'))
 
# set the secret key.  keep this really secret:
app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'

4.message

message是一个基于Session完结的用于保存数据的聚合,其特点是:使用叁次就删除

图片 13 index.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from flask import Flask, flash, redirect, render_template, request
 
app = Flask(__name__)
app.secret_key = 'some_secret'
 
@app.route('/')
def index1():
    return render_template('index.html')
 
@app.route('/set')
def index2():
    = request.args.get('p')
    flash(v)
    return 'ok'
 
if __name__ == "__main__":
    app.run()

5.中间件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from flask import Flask, flash, redirect, render_template, request
 
app = Flask(__name__)
app.secret_key = 'some_secret'
 
@app.route('/')
def index1():
    return render_template('index.html')
 
@app.route('/set')
def index2():
    = request.args.get('p')
    flash(v)
    return 'ok'
 
class MiddleWare:
    def __init__(self,wsgi_app):
        self.wsgi_app = wsgi_app
 
    def __call__(self*args, **kwargs):
 
        return self.wsgi_app(*args, **kwargs)
 
if __name__ == "__main__":
    app.wsgi_app = MiddleWare(app.wsgi_app)
    app.run(port=9999)

Flask还有不少任何职能,更加多参见:
   
    

结果如下:

图片 14

个中的 root=’.’)或
root=’./’)表示在先后当前目录下,当然你也得以领略别的的不二法门如:
root=’/path/to/file’

其次个路由@bottle.route(‘/json:json#[0-9]+#’)再次来到一个Json对象,在浏览器中输入:

结果如下:

图片 15

Web程序难免会境遇访问退步的失实,那么什么样去捕获这一个不当,Bottle可以用路由体制来捕捉错误,如下捕获40三、404:

@error(403)
def mistake403(code):
  return 'The parameter you passed has the wrong format!'

@error(404)
def mistake404(code):
  return 'Sorry, this page does not exist!'

别的错误管理照猫画虎!

您也许感兴趣的小说:

  • python bottle框架协理jquery
    ajax的RESTful风格的PUT和DELETE方法
  • 至于python的bottle框架跨域请求报错难点的管理方法
  • Python用Bottle轻量级框架举行Web开垦
  • 采纳Python的Bottle框架写一个轻松易行的服务接口的言传身教
  • Python的Bottle框架基本知识总结
  • 轻松易行的连年MySQL与Python的Bottle框架的法子
  • Python的Bottle框架中落到实处最中央的get和post的章程的学科
  • 浅谈Python使用Bottle来提供一个简练的web服务

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 澳门新葡亰官网app 版权所有