博客
关于我
Werkzeug Turorial
阅读量:797 次
发布时间:2023-04-03

本文共 4739 字,大约阅读时间需要 15 分钟。

Werkzeug 不是框架,而是一个库,用于开发应用程序和框架。它提供了一套工具,帮助开发者构建高效的 Web 应用程序。

WSGI 应用程序的基本结构如下:

def application(environ, start_response):    start_response('200 OK', [('Content-Type', 'text/plain')])    return ['Hello World!']

WSGI 应用程序是一个可调用的函数,接受 environ(包含请求信息的字典)和 start_response(开始响应的可调用对象)。environ 包含了所有请求的信息,而 start_response 表示开始处理响应。

使用 Werkzeug,可以将请求和响应进一步封装。例如:

from werkzeug.wrappers import Request, Responsedef application(environ, start_response):    request = Request(environ)    text = 'Hello %s!' % request.args.get('name', 'World')    response = Response(text, mimetype='text/plain')    return response(environ, start_response)

创建项目时,首先需要创建文件夹结构:

/shortly  /static  /templates

/shortly 文件夹下创建 shortly.py 文件:

import osimport redisfrom werkzeug.wrappers import Request, Responsefrom werkzeug.routing import Map, Rulefrom werkzeug.exceptions import HTTPException, NotFoundfrom werkzeug.middleware.shared_data import SharedDataMiddlewarefrom werkzeug.utils import redirectfrom jinja2 import Environment, FileSystemLoaderclass Shortly:    def __init__(self, config):        self.redis = redis.Redis(config['redis_host'], config['redis_port'])        self.template_path = os.path.join(os.path.dirname(__file__), 'templates')        self.jinja_env = Environment(loader=FileSystemLoader(self.template_path), autoescape=True)    def render_template(self, template_name, **context):        t = self.jinja_env.get_template(template_name)        return Response(t.render(context), mimetype='text/html')    def dispatch_request(self, request):        adapter = self.url_map.bind_to_environ(request.environ)        try:            endpoint, values = adapter.match()            return getattr(self, 'on_' + endpoint)(request, **values)        except HTTPException:            return e    def wsgi_app(self, environ, start_response):        request = Request(environ)        response = self.dispatch_request(request)        return response(environ, start_response)    def __call__(self, environ, start_response):        return self.wsgi_app(environ, start_response)def create_app(redis_host='localhost', redis_port=6379, with_static=True):    app = Shortly({        'redis_host': redis_host,        'redis_port': redis_port    })    if with_static:        app.wsgi_app = SharedDataMiddleware(app.wsgi_app, {            '/static': os.path.join(os.path.dirname(__file__), 'static')        })    return appif __name__ == '__main__':    from werkzeug.serving import run_simple    app = create_app()    run_simple('127.0.0.1', 5000, app, use_debugger=True, use_reloader=True)

运行项目:

python shortly.py

项目结构可以扩展,例如添加模板渲染和 Redis 连接:

def __init__(self, config):    self.redis = redis.Redis(config['redis_host'], config['redis_port'])    self.template_path = os.path.join(os.path.dirname(__file__), 'templates')    self.jinja_env = Environment(loader=FileSystemLoader(self.template_path), autoescape=True)

路由可以通过 Werkzeug 的 MapRule 类实现:

self.url_map = Map([    Rule('/', endpoint='new_url'),    Rule('/
', endpoint='follow_short_link'), Rule('/
+', endpoint='short_link_details')])

URL 路由的匹配和处理:

def dispatch_request(self, request):    adapter = self.url_map.bind_to_environ(request.environ)    try:        endpoint, values = adapter.match()        return getattr(self, 'on_' + endpoint)(request, **values)    except HTTPException:        return e

视图函数的实现:

def on_new_url(self, request):    error = None    url = ''    if request.method == 'POST':        url = request.form['url']        if not is_valid_url(url):            error = 'Please enter a valid URL'        else:            short_id = self.insert_url(url)            return redirect('/%s+' % short_id)    return self.render_template('new_url.html', error=error, url=url)

数据库处理:

def insert_url(self, url):    short_id = self.redis.get('reverse-url:' + url)    if short_id is not None:        return short_id    url_num = self.redis.incr('last-url-id')    short_id = base36_encode(url_num)    self.redis.set('url-target:' + short_id, url)    self.redis.set('reverse-url:' + url, short_id)    return short_id

查看链接点击次数:

def on_follow_short_link(self, request, short_id):    link_target = self.redis.get('url-target:' + short_id)    if link_target is None:        raise NotFound()    self.redis.incr('click-count:' + short_id)    return redirect(link_target)

查看链接详情:

def on_short_link_details(self, request, short_id):    link_target = self.redis.get('url-target:' + short_id)    if link_target is None:        raise NotFound()    click_count = int(self.redis.get('click-count:' + short_id) or 0)    return self.render_template('short_link_details.html', link_target=link_target, short_id=short_id, click_count=click_count)

该项目结合了 Werkzeug 的强大功能和 Redis 的高效存储,能够创建一个灵活的 URL 短链接服务。

转载地址:http://hgefk.baihongyu.com/

你可能感兴趣的文章
Oracle闪回技术(Flashback)
查看>>
oracle零碎要点---ip地址问题,服务问题,系统默认密码问题
查看>>
oracle零碎要点---oracle em的web访问地址忘了
查看>>
Oracle零碎要点---多表联合查询,收集数据库基本资料
查看>>
Oracle静默安装
查看>>
【Bert101】变压器模型背后的复杂数学【02/4】
查看>>
Oracle面试题:Oracle中truncate和delete的区别
查看>>
ThreadLocal线程内部存储类
查看>>
thinkphp 常用SQL执行语句总结
查看>>
Oracle:ORA-00911: 无效字符
查看>>
Text-to-Image with Diffusion models的巅峰之作:深入解读 DALL·E 2
查看>>
Tensorflow.python.framework.errors_impl.ResourceExhaustedError:无法分配内存[操作:AddV2]
查看>>
TCP基本入门-简单认识一下什么是TCP
查看>>
tableviewcell 中使用autolayout自适应高度
查看>>
Symbolic Aggregate approXimation(SAX,符号聚合近似)介绍-ChatGPT4o作答
查看>>
Orcale表被锁
查看>>
svn访问报错500
查看>>
sum(a.YYSR) over (partition by a.hy_dm) 不需要像group by那样需要分组函数。方便。
查看>>
ORCHARD 是什么?
查看>>
Struts2中使用Session的两种方法
查看>>