首页 » 网站建设 » tornado运行php技巧_从零单排Tornado

tornado运行php技巧_从零单排Tornado

访客 2024-12-01 0

扫一扫用手机浏览

文章目录 [+]

由于文章都是涉及到做事器的,以是福利就要写在最前面:

过大年了,大家是不是又有了压岁钱了啊??啊哈哈哈哈,压岁钱买糖吃还不如投资到自己身上。
比如用来买课程,或者用来大班事器,来学习编程,写爬虫。
来大班事器啊大班事器啊!
只在本地跑,根本没用的!
适值,铲屎官这里就有上千元的阿里云和腾讯云的优惠券给你利用(每一款优惠只要点击优惠链接,进入即可领取):

tornado运行php技巧_从零单排Tornado

阿里云部分:

tornado运行php技巧_从零单排Tornado
(图片来自网络侵删)

【阿里云新人1888元云产品通用代金券】:

https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=nrkmbo9q

【阿里云爆款云主机,2折优惠券】:

https://promotion.aliyun.com/ntms/act/qwbk.html?userCode=nrkmbo9q

【阿里云企业级做事器2折优惠券】:

https://promotion.aliyun.com/ntms/act/enterprise-discount.html?userCode=nrkmbo9q

腾讯云:

【新客户无门槛领取总代价高达2775元代金券,每种代金券限量500张,先到先得】:

https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=b351b2fc50b15866ff9d19b58a5df0f5&from=console

【腾讯云做事器、云数据库特惠,3折优惠券】:

https://cloud.tencent.com/redirect.php?redirect=1014&cps_key=b351b2fc50b15866ff9d19b58a5df0f5&from=console

--接下来是正文--

本日铲屎官给大家带来的是,如何用Tornado来搭建你自己的做事器。

我敢打包票,85%的人看不完这篇文章。
大家的自觉性便是这样。

授人以鱼不如授人以渔,这便是我为什么要写这些文章的缘由。
本日既然能够通过公众年夜众号来访问到小草,那么来日诰日我就可以通过"大众年夜众号上访问每天新闻的最新,或者我关注的人的微博更新,或者美剧是否又跟新了,或者视频网站是否又出新视频了,或者一些论坛是否发了最新的帖子,乃至每天清晨一起来,都可以通过自己的算法再结合昨天的股票数据,来推测本日大盘的涨跌,这些东西背后的事理实在都差不多的。
以是,不要把自己的思路局限在一点,要扩散,要放开,这样才会有骚操作的涌现。

行了,废话不闲扯了,来开始说说我们本日的主角:Tornado吧。

啥是Tornado

Tornado便是龙卷风,哦不,这里说的Tornado是一种 Web 做事器软件的开源版本。
Tornado 和现在的主流 Web 做事器框架(包括大多数 Python 的框架)有着明显的差异:它是非壅塞式做事器,而且速率相称快。

Tornado须要用Python编写,以是,这一系列下来,我们都是用的Python来搞事情,就和我之前说的,Python这个措辞,最适宜搞事情了!

这里要说一点,Web框架有很多种,不同措辞有不同的框架,而且特点都不一样,就Ptyhon而言,用Python开拓的Web框架也有好几种,Django,Flask,Tornado,这些框架,也是各有各的特点。
以是,我想说的是,至于要用那种框架,请结合你自身的需求来选择。
不要盲目的抓起一个随便用,这样将来会坑了自己。
我们这里,便是小型做事,自娱自乐用,以是,没有那么多顾虑,随便抓起来一个用就OK,这不,我抓的就Tornado。

把Tornado搞到做事器上

首先,做事器或者你本地的机器上面,该当是有Python的,推举Python3,然后,你的机器该当是有pip的。

我们须要通过pip来安装Tornado

# pip install tornado

安装完成,如果想测试是否安装功,只须要进入Python,然后输入import tornado,如果没有报错,就解释安装成功。

接着,我们来搞一下本地的配置。

本地,我推举利用PyCharm来做IDE。
这个IDE功能还算可以,如果你已经有自己习气的IDE,可以略过此处。

PyCharm官网上有两个可下载的版本:

PyCharm官网的两个版本

推举下载第一个,Professional,这个版本功能很强大,而且支持很多Web框架的插件。

但是好多人会创造,这个是收费版本的啊,那怎么用?

别急,破解方法非常大略,第一次打开PyCharm的时候,选择License server激活,然后填入:http://im.js.cn:8888 或 http://idea.java.sx/ 或http://xidea.online,然后点Activate激活即可。

接着,我们须要将本地的代码和做事真个代码要同步起来,做好映射,设置的步骤也很大略。
这里,我们假设远真个做事器地址是39.11.12.123。

在Tools -> Deployment -> Configuration里面:

Tools -> Deployment -> Configuration

点击左上角的 + 号:

\"大众+\公众号

出来的对话框里,名字随便写,但是下面的要选择SFTP。

填写SFTP

接着,下面这张图,第一个红框里面填写远程做事器的ip地址:39.11.12.123,第二个填写你做事器上的登录账户名称,一样平常是root,第三个便是密码。

Deployment

接着第二页,Mapping里面,第二个红框里面,填写你本机的工程目录地址,第三个红框填写在做事器上的工程目录地址(提前建好)。

Mappings

然后点击OK。
接着,在Tools -> Deployment -> Automatic Upload点击打钩,这样每次编写完一个文件,代码就可以自动同步到做事器上了。

Automatic Upload

每次如果须要同步的话,可以在Tools -> Deployment菜单里面,选择Upload to XXXX就行,或者在须要上传的文件图标点击右键,在Deployment里面选择就可以。
很方便。
上传成功的样子大概便是这样:

上传成功

好了,我们接下来就要考试测验着编写我们的代码了。
但是,对付第一次打仗新框架的你,我们还是先看一下Tornad的“Hello World”怎么写吧。

import tornado.ioloopimport tornado.webclass MainHandler(tornado.web.RequestHandler): def get(self): # 3 self.write(\"大众Hello, world\"大众) # 4def make_app(): return tornado.web.Application([ (r\"大众/\公众, MainHandler), # 2 ])if __name__ == \"大众__main__\"大众: app = make_app() # 1 app.listen(8888) tornado.ioloop.IOLoop.current().start()

在这个里面,最关键的,有这么几个地方:

make_app()声明一个tornado的application,里面就规定了做事器吸收处理的url路径。
做事器吸收了url,将会把要求交给MainHandler()来做处理。
MainHandler中的get方法,是用来处理HTTP GET要求的。
返回结果,只返回了一个字符串。

OK,上面大略的剖析,便是Tornado处理一个网络要求的逻辑。
捋顺这个逻辑之后,我们接下来就开始大略的编写一下我们自己的做事端代码吧。

撸码时候

明确一下我们的两个目的:

我们的网站能够访问数据库并且显示在网页上我们的网站能够做到给App供应数据接口功能,返回Json格式的数据。

好的,下面我们就起来撸代码,不对,是撸起来代码。

遵照我们上面所说的,定义url路径,然后写Handler。
以是,我就先按照这个思路,把工程目录按照这个样子建立了一下:

目录构造

然后,我们在main.py这个文件里面编写代码如下:

class Application(tornado.web.Application): def __init__(self): handlers = [ (r\"大众/web/\"大众, WebHandle), (r\"大众/json/\"大众, JsonHandle), ] # 定义tornado做事器的配置项,如static/templates目录位置,debug级别等 settings = dict( debug=True, static_path=os.path.join(os.path.dirname(__file__), \"大众static\公众), template_path=os.path.join(os.path.dirname(__file__), \公众templates\"大众) ) tornado.web.Application.__init__(self, handlers, settings)if __name__ == \公众__main__\"大众: print(\公众Tornado server is ready for service\r\公众) Application().listen(8000, xheaders=True) tornado.ioloop.IOLoop.current().start()

这里大略做一下阐明:

我们定义两个Handler,一个是返回网页版本的Handler,另一个是返回Json版本的;我们的Application的写法也和Hellow world例子中写的不一样,我们这样写,可以自定义很多设置,比如路径,是否Debug模式之类的。

那么我们接下来看看连个Handler怎么写的:

# views.jsonclass JsonHandle(tornado.web.RequestHandler): def get(self, args, kwargs): self.write(\"大众json view\公众)# views.webclass WebHandle(tornado.web.RequestHandler): def get(self, args, kwargs): self.write(\"大众web view\公众)

这里是两个及其大略的实现,我们来看一下效果:

JSON

Web

下面这个是访问缺点的url涌现的页面,由于我们开了Debug模式,以是页面长这个样子:

404

404页面的问题我们之后会说到。

到这里位置,我们有一个地方不知道大家创造没有,十分的不灵巧,便是上面url匹配的地方。
这里指定了:http://xxxxxx/json/只能用JsonHandler来处理,但是如果来了http://xxxxxx/json/XX,他就会报错,页面未找到。
处理这样的要求,让我们的做事变得更加强大,更加健壮,我们决定,新加一个url_router,在一定程度上,用它来掌握我们的url匹配。

\"大众\公众\"大众 url_router.py\公众\公众\"大众def include(module): res = import_module(module) urls = getattr(res, 'urls', res) return urlsdef url_wrapper(urls): wrapper_list = [] for url in urls: path, handles = url if isinstance(handles, (tuple, list)): for handle in handles: pattern, handle_class = handle wrap = ('{0}{1}'.format(path, pattern), handle_class) wrapper_list.append(wrap) else: wrapper_list.append((path, handles)) return wrapper_list

有了router,我们的main文件和handler文件都该当修正一下,在views.json和views.web目录下,分别建立json_urls.py和web_urls.py:

\"大众\"大众\公众 main.py\"大众\公众\公众class Application(tornado.web.Application): def __init__(self): # >>>> 不一样的地方开始 handlers = url_wrapper([ (r\公众/json/\"大众, include('views.json.json_urls')), (r\"大众/web/\"大众, include('views.web.web_urls')), ]) # 不一样的地方结束 <<<< # 定义tornado做事器的配置项,如static/templates目录位置,debug级别等\"大众\"大众\公众 json_urls.py\公众\"大众\"大众 urls=[ (r'', JsonHandle)]\公众\公众\公众 web_urls.py\公众\"大众\"大众urls = [ (r\"大众\"大众, WebHandle)]

这样写,虽然看上去比较乱一些,但是相称灵巧。
能够使我们的url变得丰富。
比如,如果我想添加一个查看全部json文件的url,那么我只须要在json_urls里面,添加一个(r'/all', GetAllHandler)即可,然后在json_view.py里面实现GetAllHandler就可以了。
这样做完,我们的做事器就可以同时处理http://xxxxxx/json/和http://xxxxxx/json/all两个url了,而且是不同的handler处理。

此时此刻,我们大概的框架基本搭建完成。
下面就来紧张实现一下handler里面的功能吧。

由于我们要实现的是从数据库里面读取了数据在显示到网页上,以是,这里我们用到了PyMongo这个库。
这个库是Python专门用来操作MongoDB的,炒鸡大略好用。

我们先来完成Json部分。

Json格式的返回实现

我们要在JsonHandler中,实现get()方法。
这里,我们首先从数据库中读取出来数据,然后,得将数据转换成dict()格式,由于PyMongo读取出来的数据,不能够直接转成Json,由于里面有个叫Object_id的东西,以是,这里我们就手动转一下。
然后,把数据用self.write(json.dumps({\公众data\"大众: {\"大众block\"大众: return_data, \公众curTime\"大众: cur_time}}))的形式返回回去就好。
构造相称大略,大致代码如下:

class JsonHandle(tornado.web.RequestHandler): def get(self): # 从数据库中读取数据 self.client = pymongo.MongoClient(\公众mongodb://39.11.12.123/\"大众, 27017) self.db = self.client[\"大众DailyProject\"大众] self.table = self.db[\"大众table\"大众] result = self.table.find() # 得到当前韶光 time = datetime.datetime.now() cur_time = str(time.year) + \公众-\公众 + str(time.month) + \"大众-\公众 + str(time.day) # 筛选出得当的数据 temp_posts = [] posts = [] for item in result: temp_posts.append(item) temp_posts.sort(key=lambda k: (k['post_time'][-5:]), reverse=True) for item in temp_posts: if item['post_day_time'] == cur_time: posts.append(item) # 将数据转换成dict()类型,方便转换成Json return_data = [] for item in posts: temp_dic = {'postId': item['post_id'], 'postTitle': item['post_title'], 'postPartUrl': item['post_part_url']} return_data.append(temp_dic) # 返回Json格式的数据 self.write(json.dumps({\公众data\"大众: {\"大众block\"大众: return_data, \公众curTime\"大众: cur_tim

下面是效果:

JSON

JSON

这样,实现起来是不是超级酷。
这里是实现了get方法,你也可以实现post方法来处理HTTP POST要求。
详细的逻辑还是要根据你详细的业务来编写。
反正末了用json.dumps返回就可以了。

小技巧:如果你返回的json格式都差不多,可以抽离出来,写一个模板,往后返回结果直接将数据传给模板就好。
不须要在每个方法都写一遍json的格式,那样如果修正起来,会很费事儿。

Web格式的返回实现

Web返回结果,我们这里就用到了html的东西。
首先,我们得在template里面建一个index.html文件。
然后,在WebHandler中,末了返回结果写成:self.render(\"大众index.html\"大众, info=posts, today=cur_time)这样就可以了。
这里大略说一下,第一个参数,是你template里面对应的html文件。
第二个参数和第三个参数,是你须要传给前真个数据。
名字随便叫,但是要和html里面保持同等。

Handler的代码大致如下:

class WebHandle(tornado.web.RequestHandler): def get(self): self.client = pymongo.MongoClient(\"大众mongodb://39.11.12.123/\公众, 27017) self.db = self.client[\"大众DailyProject\公众] self.table = self.db[\"大众table\公众] result = self.table.find() time = datetime.datetime.now() cur_time = str(time.year) + \"大众-\公众 + str(time.month) + \"大众-\"大众 + str(time.day) temp_posts = [] posts = [] for item in result: temp_posts.append(item) temp_posts.sort(key=lambda k: (k['post_time'][-5:]), reverse=True) for item in temp_posts: if item['post_day_time'] == cur_time: posts.append(item) self.render(\公众index.html\"大众, info=posts, today=cur_time)

由于名字要和前端逐一对应,以是,前真个代码如下:

<body><h1>技能谈论 {{today}}</h1>{% for element in info %}<div class=\公众post_block\公众> <p class=\"大众post_id\公众>{{element['post_id']}}</p> <a class=\"大众post_url\"大众 href=\"大众{{element['post_url']}}\"大众 data-url=\"大众{{element['post_url']}}\公众 target=\"大众_blank\"大众>{{element['post_title']}}</a> <p class=\公众post_time\公众>{{element['post_time']}}</p></div>{% end %}</body>

把稳,后端传过来的today对应的html里面的{{today}},info则对应的for循环里面的info。
这种for循环,语法有点像DoT.js。
别慌,这种前真个写法就那么几种,并不是很难,看懂例子怎么写,就如法泡制的往自己的html里面写就可以。

看到了吗,便是这么大略,末了我们运行起来,效果如下:

Web

404页面的处理

处理404页面,只须要在main.py文件的url中,加入一个(r\"大众.\公众, BaseHandle),然后在BaseHandler里面,返回一个你已经写好的404.html就好了。
炒鸡大略。

末了很关键的,怎么跑起来程序!

末了,代码写好了,我们须要把我们的程序跑起来。

首先,将你的工程支配到你的做事器上,通过前文所讲的支配方法,成功传上去文件。

然后,登录到你的做事器,进入工程指定的文件夹。

由于我们的启动程序是在main.py里面写的,以是,这里只须要输入指令:

# sudo python main.py &

就可以让你的Tornado后台运行了!
千万别忘了后面还有个&。

如果要关闭你的运行程序,则须要输入:

# ps -ef | grep main.py

来查找你Tornado所在的进程,通过kill指令关闭就可。

# kill -9 <进程号>

后记不后记

看到没有,这样就可以了。
一个例子虽然很大略,但是这里可以扩展的地方有很多。
很多同学肯定苦恼于不知道该怎么写做事真个代码,那么这篇文章所讲的东西可以很好的带你入门,并且入门还提高了一小步,由于并不是简大略单的只给你写hello world。

前面还提到了可以用Tornado来定时实行任务,这个东西我就不再这里说了,如果想更多互换的话,请关注『皮爷撸码』,点击下方的『进群互换』,来一起在群里谈论。

这些所讲的内容的代码,我也给大家共享出来,同样是关注『皮爷撸吗』,回答『代码』,即可得到下载地址。

末了给大家吐槽一句,爬虫的文章,你们看一篇就够了,由于爬虫这个东西,真的不是啥真金白银的技能活,这个东西,根本表示不出来你的技能,说白了便是个工具。
没啥技能含量。
那些爬来爬去爬美女爬帅哥的文章代码,我估计你写了运行一遍就完事儿了,根本不会再次运行它。
由于它给你爬的数据没用啊。
根本不像我之前的爬虫,我的爬虫,我把思路给大家讲好,而且,我的爬虫是实实在在的在做事端运行的。
爬虫便是为供应数据,并不是什么博识的技能,而且事情岗位,爬虫都是现成的,根本轮不到你写。

这么硬货的"大众号,你们不关注一下啊?

标签:

相关文章

PHP实现文字转图片的代码与应用

图片处理技术在各个领域得到了广泛应用。在PHP编程中,文字转图片功能同样具有很高的实用价值。本文将针对PHP实现文字转图片的代码进...

网站建设 2025-03-02 阅读1 评论0

NAN0017探索新型纳米材料的奥秘与应用

纳米技术作为一门新兴的交叉学科,近年来在材料科学、生物医学、电子工程等领域取得了举世瞩目的成果。其中,NAN0017作为一种新型纳...

网站建设 2025-03-02 阅读5 评论0

L26368XO代码其背后的创新与突破

编程语言在各个领域发挥着越来越重要的作用。在众多编程语言中,L26368XO代码以其独特的优势,成为了业界关注的焦点。本文将深入剖...

网站建设 2025-03-02 阅读1 评论0

HTML字体背景打造个化网页设计的关键元素

网页设计已经成为现代网络传播的重要手段。在众多网页设计元素中,字体和背景的搭配尤为关键。本文将从HTML字体背景设置的角度,探讨其...

网站建设 2025-03-02 阅读1 评论0