宁德seo推广,广州做网站seo,高明网站设计报价,试述网站建设的步骤过程Python的WEB框架 Bottle Bottle是一个快速、简洁、轻量级的基于WSIG的微型Web框架#xff0c;此框架只由一个 .py 文件#xff0c;除了Python的标准库外#xff0c;其不依赖任何其他模块。 1234pip install bottleeasy_install bottleapt-get install python-bottlewget htt…Python的WEB框架 Bottle Bottle是一个快速、简洁、轻量级的基于WSIG的微型Web框架此框架只由一个 .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(bHello {{name}}/b!, nameAlex) root.run(hostlocalhost, port8080) 一、路由系统 路由系统是的url对应指定函数当用户请求某个url时就由指定函数处理当前请求对于Bottle的路由系统可以分为一下几类 静态路由动态路由请求方法路由二级路由1、静态路由 1 2 3 root.route(/hello/) def index(): return template(bHello {{name}}/b!, nameAlex) 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, rootstatic) 3、请求方法路由 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 root.route(/hello/, methodPOST) def index(): ... root.get(/hello/) def index(): ... root.post(/hello/) def index(): ... root.put(/hello/) def index(): ... root.delete(/hello/) def index(): ... 4、二级路由 #!/usr/bin/env python
# -*- coding:utf-8 -*-
from bottle import template, Bottleapp01 Bottle()app01.route(/hello/, methodGET)
def index():return template(bApp01/b!)app01.py #!/usr/bin/env python
# -*- coding:utf-8 -*-
from bottle import template, Bottleapp02 Bottle()app02.route(/hello/, methodGET)
def index():return template(bApp02/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(bRoot {{name}}/b!, nameAlex) from framwork_bottle import app01 from framwork_bottle import app02 root.mount(app01, app01.app01) root.mount(app02, app02.app02) root.run(hostlocalhost, port8080) 二、模板系统 模板系统用于将Html和自定的值两者进行渲染从而得到字符串然后将该字符串返回给客户端。我们知道在Bottle中可以使用 内置模板系统、mako、jinja2、cheetah等以内置模板系统为例 !DOCTYPE html
html
head langenmeta charsetUTF-8title/title
/head
bodyh1{{name}}/h1
/body
/htmlhello_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, namealex) root.run(hostlocalhost, port8080) 1、语法 单值单行Python代码Python代码快Python、Html混合 h11、单值/h1
{{name}}h12、单行Python代码/h1
% s1 helloh13、Python代码块/h1
%# A block of python codename name.title().strip()if name Alex:nameseven
%h14、Python、Html混合/h1% if True:span{{name}}/span
% end
ul% for item in name:li{{item}}/li% end
/ul2、函数 include(sub_template, **variables) 1 2 3 4 5 # 导入其他模板文件 % include(header.tpl, titlePage Title) Page Content % include(footer.tpl) rebase(name, **variables) html
headtitle{{title or No title}}/title
/head
body{{!base}}
/body
/htmlbase.tpl 1 2 3 4 # 导入母版 % rebase(base.tpl, titlePage Title) pPage Content .../p defined(name) 1 # 检查当前变量是否已经被定义已定义True未定义False get(name, defaultNone) 1 # 获取某个变量的值不存在时可设置默认值 setdefault(name, default) 1 # 如果变量不存在时为变量设置默认值 扩展自定义函数 !DOCTYPE html
html
head langenmeta charsetUTF-8title/title
/head
bodyh1自定义函数/h1{{ wupeiqi() }}/body
/htmlhello_template.tpl hello_template.tpl main.py #!/usr/bin/env python
# -*- coding:utf-8 -*-
from bottle import template, Bottle,SimpleTemplate
root Bottle()def custom():return 123123root.route(/hello/)
def index():# 默认情况下去目录[./, ./views/]中寻找模板文件 hello_template.html# 配置在 bottle.TEMPLATE_PATH 中return template(hello_template.html, namealex, wupeiqicustom)root.run(hostlocalhost, port8080)main.py 注变量或函数前添加 【 ! 】则会关闭转义的功能 三、公共组件 由于Web框架就是用来【接收用户请求】- 【处理用户请求】- 【响应相关内容】对于具体如何处理用户请求开发人员根据用户请求来进行处理而对于接收用户请求和相应相关的内容均交给框架本身来处理其处理完成之后将产出交给开发人员和用户。 【接收用户请求】 当框架接收到用户请求之后将请求信息封装在Bottle的request中以供开发人员使用 【响应相关内容】 当开发人员的代码处理完用户请求之后会将其执行内容相应给用户相应的内容会封装在Bottle的response中然后再由框架将内容返回给用户 所以公共组件本质其实就是为开发人员提供接口使其能够获取用户信息并配置响应内容。 1、request Bottle中的request其实是一个LocalReqeust对象其中封装了用户请求的相关信息 request.headers请求头信息request.queryget请求信息request.formspost请求信息request.files上传文件信息request.paramsget和post请求信息request.GETget请求信息request.POSTpost和上传信息request.cookiescookie信息request.environ环境相关相关 2、response Bottle中的request其实是一个LocalResponse对象其中框架即将返回给用户的相关信息 responseresponse.status_line状态行response.status_code状态码response.headers响应头response.charset编码response.set_cookie在浏览器上设置cookieresponse.delete_cookie在浏览器上删除cookie 实例 from bottle import route, requestroute(/login)
def login():return form action/login methodpostUsername: input nameusername typetext /Password: input namepassword typepassword /input valueLogin typesubmit //formroute(/login, methodPOST)
def do_login():username request.forms.get(username)password request.forms.get(password)if check_login(username, password):return pYour login information was correct./pelse:return pLogin failed./p基本Form请求 基本Form请求 上传文件 form action/upload methodpost enctypemultipart/form-dataCategory: input typetext namecategory /Select a file: input typefile nameupload /input typesubmit valueStart upload /
/formroute(/upload, methodPOST)
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 automaticallyreturn OK上传文件 四、服务 对于Bottle框架其本身未实现类似于Tornado自己基于socket实现Web服务所以必须依赖WSGI默认Bottle已经实现并且支持的WSGI有 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(hostlocalhost, port8080, serverwsgiref) 默认serverwsgiref即使用Python内置模块wsgiref如果想要使用其他时则需要首先安装相关类库然后才能使用。如 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.ioloopcontainer tornado.wsgi.WSGIContainer(handler)server tornado.httpserver.HTTPServer(container)server.listen(portself.port,addressself.host)tornado.ioloop.IOLoop.instance().start()bottle.py源码 PS以上WSGI中提供了19种如果想要使期支持其他服务则需要扩展Bottle源码来自定义一个ServerAdapter 更多参见http://www.bottlepy.org/docs/dev/index.html 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 werkzeug #!/usr/bin/env python
# -*- coding:utf-8 -*-
from werkzeug.wrappers import Request, ResponseRequest.application
def hello(request):return Response(Hello World!)if __name__ __main__:from werkzeug.serving import run_simplerun_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默认不支持直接写正则表达式的路由不过可以通过自定义来实现见https://segmentfault.com/q/1010000000125259 三、模板 1、模板的使用 Flask使用的是Jinja2模板所以其语法和Django无差别 2、自定义模板方法 Flask中自定义模板方法的方式和Bottle相似创建一个函数并通过参数的形式传入render_template如 !DOCTYPE html
html
head langenmeta charsetUTF-8title/title
/head
bodyh1自定义函数/h1{{ww()|safe}}/body
/htmlindex.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 h1Wupeiqi/h1 app.route(/login, methods[GET, POST]) def login(): return render_template(login.html, wwwupeiqi) 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 表单处理Demo 上传文件Demo Cookie操作 app.route(/login, methods[POST, GET])
def login():error Noneif 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 invalidreturn render_template(login.html, errorerror)表单处理Demo from flask import request
from werkzeug import secure_filenameapp.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 requestapp.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_responseapp.route(/getcookie)
def index():resp make_response(render_template(...))resp.set_cookie(username, the username)return respCookie操作 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 除请求对象之外还有一个 session 对象。它允许你在不同请求间存储特定用户的信息。它是在 Cookies 的基础上实现的并且对 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 methodpost pinput typetext nameusername pinput typesubmit valueLogin /form app.route(/logout) def logout(): # remove the username from the session if its 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实现的用于保存数据的集合其特点是使用一次就删除 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(): v 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(): v 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(port9999) Flask还有众多其他功能更多参见 http://docs.jinkan.org/docs/flask/ http://flask.pocoo.org/转载于:https://www.cnblogs.com/nixingguo/p/6613584.html