Re: [问题] 新手对Web Server和Web Framework的疑问

楼主: kenduest (小州)   2016-06-28 22:10:05
ㄖ※ 引述《weinine32 (随意)》之铭言:[B
: 依学过Asp.net、php的理解是,网页程式需放在Web Server (IIS、Apache、Nginx)
: 里面才能执行。
: 而Python有Web Framework,似乎可以不需要Web Server就可以执行?
: 但是网络上又有人分享如何部署 django + nginx + uwsgi
: 想请问:
: 1) 直接使用Web Framework部署网页和django + nginx + uwsgi的差异?
可能需要先说说 Python Web Server Gateway Interface 这东西比较好说下去?
这与 CGI 很类似。WSGI 基本上算是用 python 要写 web 程式的一个标准,
详细可以参考 PEP 333
python 自己本身就有 WSGI 协定架构的支援,只是一般直接用 python 这个
interpreter 来执行 WSGI 架构的程式码速度不大好而且还有很多议题得处理,
所以会使用比较专门的 WSGI 程式来执行 python 的程式码。写 django 的时候
开发阶段一般我们常会用 django runserver 命令跑一个 http server 在某个
port 上面工作,这时候主要是开发简单方便,运作的速度效能就不是考虑重点。
实作 WSGI 协定的程式很多,就你文章内提到 uwsgi (uWSGI) 就是一种主流
的程式,因为他是使用 c 开发的程式所以处理与执行效能很好,其他像是还有
Gunicorn 以很常见,不过它程式码还是以 Python 实作。实作 WSGI 的程式
基本上算是相当多。
所以用 django 开发的程式后续会用 uwsgi (uWSGI) 程式来启动,而 uWSGI 程式
启动时候可以指定 WSGI 还是 HTTP 沟通协定提供外部的存取。一般会以 WSGI
模式来启动为效能考量。不过外部浏览器等当然还是以 HTTP 方式请求,所以还要
搭配一个 HTTP Server 像是 nginx 来使用。
nginx 本身设计上运作很有效率,所以效能上比 apache 好不少,而且本身内建
可以直接支援 UWSGI 程式沟通的能力,简单设定档案设定一下就可以把请求 pass
给所写的 django 程式。另外用 uwsgi 本身还可以搭配其他不同设定,这会比
直接让 uWSGI 加载 django app 之后直接 listen port 提供 HTTP 存取更好。
所以用 Django 这个 Framework 来说 runserver 就可以跑相关整个 HTTP 服务,
只是一般是开发阶段用为主,正式 production 不会这样使用...
: 2) 目前用Python写网页程式的主流方法是什么?
web app 目前一般常见还是搭配 Django 比较多,小型一点有人会使用 Flask,
Flash 比较简单阳春,要完备点比较多人是选 Django。Django 底层当然还是使用
WSGI,只是多一层封装了。
: 3) 是否也可以用Gevent做Web Server? Gevent也是属于Web Framework吗?
: 谢谢
gevent 内也有 WSGI 项目,会用 Gevent 主要是它的 async 架构的设计写
特定应用程式会很方便,只是目前比较少人会用 gevent 写 web 程式,目前
一般大多都是用到它的 co-routine 一些特性,官网的例子:
>>> import gevent
>>> from gevent import socket
>>> urls = ['www.google.com', 'www.example.com', 'www.python.org']
>>> jobs = [gevent.spawn(socket.gethostbyname, url) for url in urls]
>>> gevent.joinall(jobs, timeout=2)
>>> [job.value for job in jobs]
['74.125.79.106', '208.77.188.166', '82.94.164.162']
一般网络请求存取都是 blocking mode 运作模式,若用传统的方式要解析一堆主机
名称的 ip 位址常常会花时间在等待网络回应上,一个解析完成再解析另外一个...
若过程一个卡住就等它 timeout。
用 gevent 的 co-routine 的特性就可以加快整段的运作速度。以往要解决,大多会使用
thread 方式来避开这类问题,而使用 gevent 在这个需求上就会单纯不少。目前我把他当
python 2.x 世代上 asyncio 使用的一般 Library 来看待,只是谈 coroutine 又是另外
一个大领域了。
作者: gozule (好冷啊~~)   2016-06-28 22:24:00
顺便请问一下,如果想要研究django, 要从那个角度切入比较顺,MTV三块直接硬看有点累
楼主: kenduest (小州)   2016-06-28 22:32:00
django 其实目前网络的教学文章很多,官网有一份django tutorial 文件,另外也有人翻译中文版本可阅读最近不是有个 django girls 的教学也可以参考呼?
作者: weinine32 (随意)   2016-06-28 22:47:00
非常祥细,谢谢你!
作者: gbllggi (gbllggi)   2016-06-29 02:02:00
长知识
作者: alibuda174 (阿哩不达)   2016-06-29 08:32:00
作者: ccc5b683 (嘻嘻嘻五逼六八三)   2016-06-29 08:32:00
长知识
作者: Neisseria (Neisseria)   2016-06-29 10:27:00
作者: frank910138 (frank)   2016-06-30 23:46:00
推 长知识了

Links booklink

Contact Us: admin [ a t ] ucptt.com