支持gopher协议的flask扩展

Flask-Gopher的Python项目详细描述


烧瓶地鼠




<;p align="中心">;
<;img alt="gopher" src="resources/gopher_alt.jpg/gt;
<;p>;


<;p align="center">;
<;a a a a a a a a a a a a a a a a>
<;br/><;img alt="pypi" src="http://www://img.shielg.shield.shield.shi是的s.io/pypi/v/flask-gopher.svg?label=version"/>;
<;/a>;
<;a href="https://pypi.python.org/pypi/flask gopher/">;
<;img alt="python" src="https://img.shields.io/badge/python-3.4+-blue.svg"/>;
<;/a>;
<;a href="https://travis ci.org/michael lazar/flask gopher">;
<;img alt="travis ci" src="https://travis-ci.org/michael-lazar/flask-gopher.svg?branch=master"/>;
<;/a>;
<;a href="https://coveralls.io/github/michael-lazar/flask-gopher?branch=master">;
<;img alt="工作服" src="https://coveralls.io/repos/michael-lazar/flask-gopher/badge.svg?branch=master&;service=github">;
<;a>;
<;p>;









*[快速入门](《快速入门》)
*[关于](《关于》)
*[演示](《演示》
*[安装](《安装》
*[关于]
*[关于]
*[关于构建地鼠的菜单](《构建地鼠菜单》《构建地鼠菜单》《构建地鼠菜单》《构建地鼠菜单》




*[关于安装]
*[关于搭建地鼠的安装]
*br/>*[使用模板](使用-模板)
*[gopher和wsgi](gopher和wsgi)
*[tls支持](tls支持)
*[gopher协议引用](gopher协议引用)




app=flask(u name_uu)
gopher=gopherextension(app)

@app.route('/')
def index():
返回gopher.render_u菜单(
gopher.menu.title('my gopherhole'),
gopher.menu.submenu('home','url_x('index'),
gopher.menu.info("look ma,这是一个gop她的侍者!")

*

Gopher是90年代初流行到顶峰的万维网的替代品。仍然有少数Gopher网站由爱好者维护;您可以在http://gopher.floodgap.com/gopher/

*Flask Gopher是什么?*

Flask Gopher是一个[烧瓶](http://flask.pocoo.org/docs/1.0/)扩展,它在内置Web服务器周围添加了一个薄的*Gopher->;http*兼容层。这意味着您可以完全访问Flask的路由、模板引擎、调试器等等!

*这是给谁的?*

我创建这个扩展是因为我想尝试构建动态地鼠应用程序,但我对现有地鼠服务器缺乏灵活性感到沮丧。目标读者是有经验使用高级web框架(如django或ruby on rails)的web开发人员。编写python代码并交叉引用正式的flask文档,您应该感到很舒服。

="gopher://mozz.us:7005">;gopher://mozz.us:7005<;a>;<;b>;<;br>;
<;p>;




>









>此软件包要求**pythov3.4或更高版本的**

````
>pip-install-flask-gopher
`





构建地鼠菜单结构化文本文件,显示有关当前页的信息并包含指向其他地鼠资源的链接。gopher菜单大致相当于只带有`<;a>;``和`<;span>;``标记的html文档。菜单中的每一行都有一个*类型*来说明它链接到哪种资源(文本、二进制、HTML、Telnet等)。


Flask Gopher提供了几种构造Gopher菜单行的帮助方法:


-|------------------- | -------- |
| menu.file | 0 | Plain text file |
| menu.submenu | 1 | Gopher menu |
| menu.ccso | 2 | CCSO database; other databases |
| menu.error | 3 | Error message |
| menu.binhex | 4 | Macintosh BinHex file |
| menu.archive | 5 | Archive file (zip, tar, gzip) |
| menu.uuencoded | 6 | UUEncoded file |
| menu.query | 7 | Search query |
| menu.telnet | 8 | Telnet session |
| menu.binary | 9 | Binary file |
| menu.gif | g | GIF format graphics file |
| menu.image | I | Other Image file |
| menu.doc | d | Word processing document (ps, pdf, doc) |
| menu.sound | s | Sound file |
| menu.video | ; | Video file |
| menu.info i information line
menu.title i title line
menu.html h html document

大多数这些方法都需要链接的文本描述,并将接受路径选择器和主机/端口。它们返回一行文本,这些文本已经为gopher菜单预先格式化。然后,您可以将所有行传递到"gopher.render廑menu()"以构建响应体。

``python
@app.route('/')
def index():
return gopher.render廑menu(
链接到内部gopher menu
gopher.menu.submenu('home','/'),

链接到外部gopher menu
gopher.menu.submenu('xkcd comics','/fun/xkcd',host='gopher.floodgap.com',port=70),

URCE','https://github.com/michael lazar/flask gopher'),

"0关于这个网页,t/about.txt\t127.0.0.0.0.1\t8007"
`````


>这里是呈现菜单的样子:


`````
$curlggopher://localhost:8007
1home/127.0.0.1 8007
1xkcd漫画/fun/xkcd gopher gopher.floodgap.com 70
ipcture of a cat/static/cat.png 127.0.0.0.0.18001.18007
pproject source
>hproject源代码如下:




网址:https://github.com/michael-lazar/flask gopher 127.0.0.1 8007
这是一个信息文本fake example.com 0
i fake example.com 0
i没有位置fake example.com 0
我喜欢::1 fake example.com 0
i fake example.com 0
0关于此页/about.txt 127.0.0.1 8007
`````
<;p align="center">;
<;img alt="gopher" src="resources/example_menu.png"/>;
<;/p>;


\flask gopher会自动将"gopher"对象注入模板名称空间,这样您就可以访问菜单助手函数。推荐的地鼠模板文件命名约定是添加一个*.gopher*后缀。示例模板文件如下所示:

**模板/示例"menu.gopher**
````
{"居中标题"{"下划线('-')"居中}

{{"gopher.menu.submenu('home',url''index')}


ip地址是{{request.remote\u addr}



{{{{{{{{{{{{{{{{{}
{{('由'+request.environ['server'u software']};rjust}
`````





``调用`` gopher.gopher.render\u menu template()``从您的路由内{{{{{{{{{{{{{('由'+request.request.environ['server'server'server'server'u software']]]]}}}}}{{{{{{{{路由('/')
def index():
return gopher.render_menu_template('example_menu.gopher')
````

<;p align="center">;
<;img alt="gopher" src="resources/example_template.png"/>;
<;/p>;


定义python web服务器(gunicorn、mod_wsgi等)如何与应用程序框架(flask、django等)通信。它定义了低级套接字和请求处理以及高级应用程序逻辑之间的清晰边界。

wsgi被设计成一个非常简单和灵活的api,但其核心是围绕http请求构建的。因此,它包含一些特定于http的组件,如请求/响应头和状态代码。地鼠更简单,不使用这些组件。以下是使用两种协议获取文档的差异示例:

<;table>;
<;tr>;<;tr>;<;th>;request<;/th>;<;th>;response<;/th>;<;request<;<;&th>;lt;th>;lt;th>;lt;lt;th>;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;gt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;gt;lt;lt;lt;gt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;gt;lt;lt;lt;lt;lt;lt;lt;gt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt阿帕奇
内容类型:文本/html
。<;br>;
(正文)
<;lt;pre>;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;gt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;gt;lt;lt;lt;lt;lt;gt;lt;lt;lt;lt;lt;lt;lt;gt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt分歧在gopher和http之间,**flask gopher**实现了一个自定义的"gopherrequesthandler"。处理程序挂接到wsgi服务器(``werkzeug.basewsgiserver``)。它读取每个TCP连接的第一行,并确定客户端正在尝试使用哪个协议。如果客户端正在使用gopher,则会做出以下假设:

-将请求的*请求方法*设置为``get`
-将请求的*服务器协议*(例如*http/1.1*)设置为``gopher`
-将请求的*wsgi.url方案*(例如*http s*)设置为``gopher`
-放弃响应stats行
-丢弃所有响应头

这样做会使gopher连接*从wsgi应用程序的角度看起来像一个普通的http请求。它还提供了可以从flask请求访问的元数据挂钩。例如,根据使用的协议,您可以以不同的方式响应请求:

``python
@app.route('/')
def index():
if flask.request.scheme=='gopher':
return"这是一个gopher请求\tfake\texsample.com\t0\r\n"
else:
return"<;html>;<;body>;这是一个http请求<;body>;<;html>;"
````

\tls支持


没有"http://``vs``http s://``或"port 80``vs``port 443``的区别,就像我们在http世界中一样。然而,这个话题在地鼠社区中越来越引起人们的兴趣。新的gopher客户端和服务器开始尝试不同程度地支持tls。


flask gopher通过查看每个传入连接来确定客户端是否正在尝试tls握手来解决安全问题。如果是,请求的内容将通过安全套接字自动返回。否则,内容将作为纯文本返回。此方案的优点是完全向后兼容较老的gopher客户端。所有内容都由运行在端口70上的一个Gopher服务器提供,客户端可以控制它们想要如何接收这些内容。


``python
from flask_gopher import make_gopher_ssl_server

app=…

如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果说,如果()
```

启用TLS时,``request.environ['secure']``变量包含当前请求是否通过安全套接字发出。


正在寻找一个Gopher客户端,以便使用它进行尝试?索德朋克的[VF-1(https://github.com/solderpunk/vf-1)(https://github.com/solderpunk/vf-1)是一个很好的选择:

`` bash
$vf1 mozz.us:7005/1/demo ssl-ssl——tls
`
` ` `
` ` ` gopher协议参考



-https://tools.ietf.org/http://tools.ietf.org/http://tools.ietf.ietf.org/http://tools.ietf.org/html/rfc4266(2005)
` ` br/>-https://tools.ietf.org/html/draft-matavka-gopher-ii-03(2015年)
-https://www.w3.org/addressing/url/4_1_gopher+.html

有趣的一点是,python标准库曾经包含自己的gopher模块。它在2.5中被弃用,在2.6中被删除。(<;em>;https://www.python.org/dev/peps/pep-0004/<;/em>;)



>;模块名称:gopherlib
>;基本原理:gopher协议不再有效使用。
>;日期:2000年10月1日。
>;文档:自python 2.5以来被记录为已弃用。在python 2.6中删除了
>。


旧python svn trunk中仍然存在一个参考gopher客户端:https://svn.python.org/projects/python/trunk/demo/sockets/gopher.py


欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Java的Arraylist上的操作运行时是什么?   java按下按钮并显示通知   java如何修复“javax.net.ssl.SSLHandshakeException:20190416之后颁发并由不受信任的旧Symantec根CA锚定的TLS服务器证书”   用于新语言插件SonarQube的java解析器   java ANTLR4:参考书示例静态类定义   java如何计算用户点击按钮的次数以及如何保存按钮。安卓工作室   JSP if()语句中的java HTML不起作用   java仿真器崩溃“无效int”   雪花与Java应用程序的集成   从一家银行一行一行地拿到。带有自定义行尾的java txt文档   java从该方法的参数中获取值并显示   我的Eclipse插件尚未找到JAXBAPI的java实现   类如何从顶部文件夹加载java字节码(如果存在“.”)在子文件夹中?   ibm集成总线ibm MessageBroker Java API:Java。lang.NoClassDefFoundError:com。国际商用机器公司mq。MQException