如何使用tornado 登录里面的HTTPClient模拟登录网站

tornado.httpclient — Asynchronous HTTP client & Tornado 4.2.1 documentation基于HttpClient 4模拟登录论坛 - 我的框架师之路 - ITeye技术网站
博客分类:
import java.io.BufferedR
import java.io.IOE
import java.io.InputS
import java.io.InputStreamR
import org.apache.http.H
import org.apache.http.HttpE
import org.apache.http.HttpR
import org.apache.http.NameValueP
import org.apache.http.client.ClientProtocolE
import org.apache.http.client.entity.UrlEncodedFormE
import org.apache.http.client.methods.HttpG
import org.apache.http.client.methods.HttpP
import org.apache.http.impl.client.DefaultHttpC
import org.apache.http.message.BasicNameValueP
import org.apache.http.util.EntityU
import java.util.ArrayL
import java.util.L
* DZ 登录与发贴 实例
* @author 创建人
public class LoginDZ extends Thread{
static final String domainurl = "/"; //原始地址
static final String loginurl = "/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes";//登录地址
static final String loginUsername = "username"; // 登录用户名
static final String loginPassword = "password"; // 密码
static final String username = "admin"; // 登录用户名(自己改)
static final String password = "123456"; // 登录密码(自己改)
* 状态码对应 HttpServletResponse 的常量详细描述
* @author Administrator
static class HttpStatus {
static int SC_MOVED_TEMPORARILY = 301; // 页面已经永久移到另外一个新地址
static int SC_MOVED_PERMANENTLY = 302; // 页面暂时移动到另外一个新的地址
static int SC_SEE_OTHER = 303; // 客户端请求的地址必须通过另外的 URL 来访问
static int SC_TEMPORARY_REDIRECT = 307; // 页面暂时移动到另外一个新的地址
* 获取 formhash 值value
* @param url
* @throws IOException
* @throws ClientProtocolException
* @throws IOException
* @throws ClientProtocolException
public String getFormhash(String url,DefaultHttpClient httpclient) throws ClientProtocolException, IOException {
HttpGet httpGet = new HttpGet(url);
HttpResponse response = httpclient.execute(httpGet);
HttpEntity entity = response.getEntity();
StringBuffer sb =
// 输出页面内容
if (entity != null) {
String charset = EntityUtils.getContentCharSet(entity);
InputStream is = entity.getContent();
sb = new StringBuffer();
BufferedReader br = new BufferedReader(new InputStreamReader(is,
charset));
String line =
while ((line = br.readLine()) != null) {
sb.append(line);
is.close();
int pos = sb.indexOf("name=\"formhash\" value=");
// 找出这个 formhash 的内容,这是登录用的 formhash
String login_formhash = sb.substring(pos + 23, pos + 23 + 8);
return login_
* @param httpclient
* @param user 用户名
* @param pass 密码
* @param formhash 提交的表单formhash值
* @throws ClientProtocolException
* @throws IOException
public boolean logicDz(DefaultHttpClient httpclient,String formhash) throws ClientProtocolException, IOException{
/* 创建post连接 */
HttpPost httpPost = new HttpPost(loginurl);
/* 创建登录条件 */
List&NameValuePair& nvps = new ArrayList&NameValuePair&();
nvps.add(new BasicNameValuePair("username", username));
nvps.add(new BasicNameValuePair("password", password));
nvps.add(new BasicNameValuePair("formhash", formhash));
/* 添加到httpPost提交的内容中 */
httpPost.setEntity(new UrlEncodedFormEntity(nvps, "gbk"));
/*执行并打印登录后内容显示情况*/
printHttpGet(httpclient.execute(httpPost));
HttpResponse response = httpclient.execute(httpPost);//不打印登录情况
/*判断登录是否成功*/
HttpEntity entity = response.getEntity();
StringBuffer sb =
// 输出页面内容
if (entity != null) {
String charset = EntityUtils.getContentCharSet(entity);
InputStream is = entity.getContent();
sb = new StringBuffer();
BufferedReader br = new BufferedReader(new InputStreamReader(is,
charset));
String line =
while ((line = br.readLine()) != null) {
sb.append(line+"\t\n");
is.close();
if(sb.indexOf("title=\"访问我的空间\"") != -1){
int pos = sb.indexOf("title=\"访问我的空间\"");
String username =sb.substring(pos+15, pos+50);
username = username.substring(0, username.indexOf("&", 1));
System.out.println("登录时的 用户名为:"+username);
System.out.println("#################################
############################");
/*释放资源*/
httpPost.abort();
* 发贴 成功后返回页面内容
* @param httpclient
* @param url
* @param message
* @param subject
* @param login_formhash
* @return HttpResponse
* @throws ClientProtocolException
* @throws IOException
public HttpResponse postMessage(DefaultHttpClient httpclient,String url,String message,String subject,String login_formhash) throws ClientProtocolException, IOException{
HttpPost httpPost = new HttpPost(url);
HttpResponse response =
List&NameValuePair& nvps = new ArrayList&NameValuePair&();
nvps.add(new BasicNameValuePair("message", message));
nvps.add(new BasicNameValuePair("subject", subject));
nvps.add(new BasicNameValuePair("formhash", login_formhash)); //提交form的hash值(防外提交form的)
/*以下的可以不设置,看了一下论坛中,这两个都有值的*/
nvps.add(new BasicNameValuePair("allownoticeauthor", "1"));
nvps.add(new BasicNameValuePair("wysiwyg", "1"));
httpPost.setEntity(new UrlEncodedFormEntity(nvps, "gbk"));
response = httpclient.execute(httpPost);
/*释放资源*/
httpPost.abort();
* @param httpclient
* @param httpost
* @param message
* @param subject
* @param login_formhash
* @throws ClientProtocolException
* @throws IOException
public HttpResponse postReMessage(DefaultHttpClient httpclient,String url,String message,String subject,String login_formhash) throws ClientProtocolException, IOException{
HttpResponse response =
/*提交的url,需要加上domainurl的地址*/
url = getReMessageUrl(url,httpclient);
System.out.println("回复提交表单地址
url="+url);
HttpPost httpPost = new HttpPost(url);
List&NameValuePair& nvps = new ArrayList&NameValuePair&();
nvps.add(new BasicNameValuePair("message", message));
nvps.add(new BasicNameValuePair("subject", subject));
nvps.add(new BasicNameValuePair("formhash", login_formhash)); //提交form的hash值(防外提交form的)
/*以下的可以不设置,看了一下论坛中,这两个都有值的*/
nvps.add(new BasicNameValuePair("allownoticeauthor", "1"));
nvps.add(new BasicNameValuePair("wysiwyg", "1"));
httpPost.setEntity(new UrlEncodedFormEntity(nvps, "gbk"));
response = httpclient.execute(httpPost);
/* 释放资源 */
httpPost.abort();
* 获取回复的url
* @param url
* @param httpclient
* @throws ClientProtocolException
* @throws IOException
public String getReMessageUrl(String url,DefaultHttpClient httpclient) throws ClientProtocolException, IOException {
HttpGet httpGet = new HttpGet(url);
Invalid use of SingleClientConnManager: connection still allocated.
HttpResponse response = httpclient.execute(httpGet);
HttpEntity entity = response.getEntity();
StringBuffer sb =
// 输出页面内容
if (entity != null) {
String charset = EntityUtils.getContentCharSet(entity);
InputStream is = entity.getContent();
sb = new StringBuffer();
BufferedReader br = new BufferedReader(new InputStreamReader(is,
charset));
String line =
while ((line = br.readLine()) != null) {
sb.append(line+"\t\n");
is.close();
int pos = sb.indexOf("id=\"fastpostform\" action=");
int pos_end = sb.indexOf("fastpost\"");
System.out.println(sb.length()+"
pos="+pos+"
pos_end="+pos_end);
// 找出这个 reMessageUrl 的内容
String reMessageUrl = domainurl + sb.substring(pos+26, pos_end+8);
reMessageUrl = reMessageUrl.replaceAll("", "");
//释放资源
httpGet.abort();
return reMessageU
* 获取重定向的url
* @param httpclient
* @param response
* @return 返回url地址
public String redirectHttp(DefaultHttpClient httpclient,HttpResponse response) {
Header header = response.getFirstHeader("location");
String urlRedirect = "";
if(!header.getValue().contains(domainurl)){
urlRedirect = domainurl+header.getValue();
urlRedirect = header.getValue();
return urlR
* 根据HttpResponse对象 打印页面内容
* @param response
* @throws IOException
* @throws IllegalStateException
public void printHttpGet(HttpResponse response) throws IllegalStateException, IOException{
HttpEntity entity = response.getEntity();
StringBuffer sb =
// 输出页面内容
if (entity != null) {
String charset = EntityUtils.getContentCharSet(entity);
InputStream is = entity.getContent();
sb = new StringBuffer();
BufferedReader br = new BufferedReader(new InputStreamReader(is,
charset));
String line =
while ((line = br.readLine()) != null) {
sb.append(line+"\t\n");
is.close();
System.out.println(sb.toString());
* 主函数 main()
* @param args
* @throws IOException
* @throws InterruptedException
public static void main(String args[]) throws IOException, InterruptedException {
LoginDZ loginDZ = new LoginDZ();
connectionManager
DefaultHttpClient httpclient = new DefaultHttpClient();// 得到httpclient实例
/* 登录论坛 */
System.out.println("#################################
############################");
String login_formhash = loginDZ.getFormhash(domainurl,httpclient);//获取formhash
if(!loginDZ.logicDz(httpclient,login_formhash)){
System.out.println("#################################
############################");
/* 开发发贴 */
System.out.println("#################################
############################");
String url =
//发贴的url
String message = //发贴的内容
String subject = //发贴的标题
/* 这个就是发贴机了
自己去加吧,可以用线程多个一起发,不用等
其中fid不同而已,可从1开始到50*/
for(int i=0;i&1;i++){
/* 发贴参数 */
url = "/forum.php?mod=post&action=newthread&fid=24&extra=&topicsubmit=yes";
message = "最近组建创业团队,搞IT行业,欢迎加入,请留下你的联系方式";
subject = "最近组建创业团队,搞IT行业,欢迎加入";
login_formhash = loginDZ.getFormhash(url,httpclient);
/* 调用发贴方法 四个参数,其中最后一个为form提交的hash值 */
HttpResponse response = loginDZ.postMessage(httpclient, url, message, subject, login_formhash);
/* 测试看看内容 */
System.out.println("#################################
发贴完成后 内容如下
############################");
loginDZ.printHttpGet(response); //打印发贴后的页面看看
System.out.println("#################################
重定向跳转页面
############################");
/* 获取重定向标识码 */
int statuscode = response.getStatusLine().getStatusCode();
if ((statuscode == HttpStatus.SC_MOVED_TEMPORARILY)
|| (statuscode == HttpStatus.SC_MOVED_PERMANENTLY)
|| (statuscode == HttpStatus.SC_SEE_OTHER)
|| (statuscode == HttpStatus.SC_TEMPORARY_REDIRECT)) {
System.out.println("#################################
开始发表回复
############################");
/* 发表回复 */
url = loginDZ.redirectHttp(httpclient, response);
message = "最好介绍一下自己,我会选择性的加大家的,最好加上联系的QQ之类的";
subject = "最近组建创业团队,搞IT行业,欢迎加入";
login_formhash = loginDZ.getFormhash(url,httpclient);
for(int j=0;j&1;j++){
//可以多次对一个帖子回复
sleep(10000);//等10秒再回复
response = loginDZ.postReMessage(httpclient,url, message, subject, login_formhash);
/*打印页面内容*/
loginDZ.printHttpGet(response);
url = "/thread--1.html";
message = "这个真不敢乱留联系方式,怕!好怕";
subject = "最近组建创业团队,搞IT行业,欢迎加入";
login_formhash = loginDZ.getFormhash(url,httpclient);
for(int i=15;i&20;i++){
System.out.println(message+" 现在是" + i);
loginDZ.postReMessage(httpclient,url, message, subject, login_formhash);
sleep(10000);
/* 关闭连接管理器 */
httpclient.getConnectionManager().shutdown();
代码就上面的,原理就不说了,备注那么多,相信你可以看的懂。
以上也是我写代码的一般风格,还有很多不好的地方,请指出,谢谢!
欢迎朋友们一起讨论。
如果想做相关的一些发贴器,登录机的,请联系我QQ:,说明来意。
另外这个程序的目的不是登录论坛,是登录cmcc,这只是做为测试,家里没有cmcc的ap。
浏览: 198325 次
来自: 广州
浏览量:22174
我也在考驾照 累死了,不错
来几篇线程池的
operthing 写道
Jacarri_Chan 写道你觉得hibernate的优势和 ...如何使用HttpClient_百度知道
如何使用HttpClient
提问者采纳
这里举几个应用。1. 读取网页(HTTP/HTTPS)内容 下面是我们给出的一个简单的例子用来访问某个页面 *
* Created on
by skydong
package http.
import java.io.IOE
import mons.httpclient.*;
import mons.httpclient.methods.*;
* 最简单的HTTP客户端,用来演示通过GET或者POST方式访问某个页面
* @author skydong
public class SimpleClient ...{
public static void main(String[] args) throws IOException
HttpClient client = new HttpClient();
//设置代理服务器地址和端口
//client.getHostConfiguration().setProxy(&proxy_host_addr&,proxy_port);
//使用GET方法,如果服务器需要通过HTTPS连接,那只需要将下面URL中的http换成https
HttpMethod method = new GetMethod(&&;);
//使用POST方法
//HttpMethod method = new PostMethod(&&;);
client.executeMethod(method);
//打印服务器返回的状态
System.out.println(method.getStatusLine());
//打印返回的信息
System.out.println(method.getResponseBodyAsString());
//释放连接
method.releaseConnection();
在这个例子中首先创建一个HTTP客户端(HttpClient)的实例,然后选择提交的方法是GET或者POST,最后在HttpClient实例上执行提交的方法,最后从所选择的提交方法中读取服务器反馈回来的结果。这就是使用HttpClient的基本流程。其实用一行代码也就可以搞定整个请求的过程,非常的简单! 2. 以GET或者POST方式向网页提交参数 其实前面一个最简单的示例中我们已经介绍了如何使用GET或者POST方式来请求一个页面,本小节与之不同的是多了提交时设定页面所需的参数,我们知道如果是GET的请求方式,那么所有参数都直接放到页面的URL后面用问号与页面地址隔开,每个参数用&隔开,例如:?name=liudong&mobile=123456,但是当使用POST方法时就会稍微有一点点麻烦。本小节的例子演示向如何查询手机号码所在的城市,代码如下: *
* Created on
by skydong
package http.
import java.io.IOE
import mons.httpclient.*;
import mons.httpclient.methods.*;
* 提交参数演示
* 该程序连接到一个用于查询手机号码所属地的页面
* 以便查询号码段1330227所在的省份以及城市
* @author skydong
public class SimpleHttpClient ...{
public static void main(String[] args) throws IOException
HttpClient client = new HttpClient();
client.getHostConfiguration().setHost(&&, 80, &http&);
HttpMethod method = getPostMethod();//使用POST方式提交数据
client.executeMethod(method);
//打印服务器返回的状态
System.out.println(method.getStatusLine());
//打印结果页面
String response =
new String(method.getResponseBodyAsString().getBytes(&8859_1&));
//打印返回的信息
System.out.println(response);
method.releaseConnection();
* 使用GET方式提交数据
private static HttpMethod getGetMethod()...{
return new GetMethod(&/simcard.php?simcard=1330227&);
* 使用POST方式提交数据
private static HttpMethod getPostMethod()...{
PostMethod post = new PostMethod(&/simcard.php&);
NameValuePair simcard = new NameValuePair(&simcard&,&1330227&);
post.setRequestBody(new NameValuePair[] ...{ simcard});
在上面的例子中页面http:///simcard.php需要一个参数是simcard,这个参数值为手机号码段,即手机号码的前七位,服务器会返回提交的手机号码对应的省份、城市以及其他详细信息。GET的提交方法只需要在URL后加入参数信息,而POST则需要通过NameValuePair类来设置参数名称和它所对应的值 3. 处理页面重定向 在JSP/Servlet编程中response.sendRedirect方法就是使用HTTP协议中的重定向机制。它与JSP中的的区别在于后者是在服务器中实现页面的跳转,也就是说应用容器加载了所要跳转的页面的内容并返回给客户端;而前者是返回一个状态码,这些状态码的可能值见下表,然后客户端读取需要跳转到的页面的URL并重新加载新的页面。就是这样一个过程,所以我们编程的时候就要通过HttpMethod.getStatusCode()方法判断返回值是否为下表中的某个值来判断是否需要跳转。如果已经确认需要进行页面跳转了,那么可以通过读取HTTP头中的location属性来获取新的地址。 状态码 对应HttpServletResponse的常量 详细描述 301 SC_MOVED_PERMANENTLY 页面已经永久移到另外一个新地址 302 SC_MOVED_TEMPORARILY 页面暂时移动到另外一个新的地址 303 SC_SEE_OTHER 客户端请求的地址必须通过另外的URL来访问 307 SC_TEMPORARY_REDIRECT 同SC_MOVED_TEMPORARILY 下面的代码片段演示如何处理页面的重定向
client.executeMethod(post);
System.out.println(post.getStatusLine().toString());
post.releaseConnection();
//检查是否重定向
int statuscode = post.getStatusCode();
if ((statuscode == HttpStatus.SC_MOVED_TEMPORARILY) ||
(statuscode == HttpStatus.SC_MOVED_PERMANENTLY) ||
(statuscode == HttpStatus.SC_SEE_OTHER) ||
(statuscode == HttpStatus.SC_TEMPORARY_REDIRECT))
...{//读取新的URL地址
Header header = post.getResponseHeader(&location&);
if (header != null) ...{
String newuri = header.getValue();
if ((newuri == null) || (newuri.equals(&&)))
newuri = &/&;
GetMethod redirect = new GetMethod(newuri);
client.executeMethod(redirect);
System.out.println(&Redirect:&+ redirect.getStatusLine().toString());
redirect.releaseConnection();
} else ...{
System.out.println(&Invalid redirect&);
} 我们可以自行编写两个JSP页面,其中一个页面用response.sendRedirect方法重定向到另外一个页面用来测试上面的例子。 本小节应该说是HTTP客户端编程中最常碰见的问题,很多网站的内容都只是对注册用户可见的,这种情况下就必须要求使用正确的用户名和口令登录成功后,方可浏览到想要的页面。因为HTTP协议是无状态的,也就是连接的有效期只限于当前请求,请求内容结束后连接就关闭了。在这种情况下为了保存用户的登录信息必须使用到Cookie机制。以JSP/Servlet为例,当浏览器请求一个JSP或者是Servlet的页面时,应用服务器会返回一个参数,名为jsessionid(因不同应用服务器而异),值是一个较长的唯一字符串的Cookie,这个字符串值也就是当前访问该站点的会话标识。浏览器在每访问该站点的其他页面时候都要带上jsessionid这样的Cookie信息,应用服务器根据读取这个会话标识来获取对应的会话信息。 对于需要用户登录的网站,一般在用户登录成功后会将用户资料保存在服务器的会话中,这样当访问到其他的页面时候,应用服务器根据浏览器送上的Cookie中读取当前请求对应的会话标识以获得对应的会话信息,然后就可以判断用户资料是否存在于会话信息中,如果存在则允许访问页面,否则跳转到登录页面中要求用户输入帐号和口令进行登录。这就是一般使用JSP开发网站在处理用户登录的比较通用的方法。 这样一来,对于HTTP的客户端来讲,如果要访问一个受保护的页面时就必须模拟浏览器所做的工作,首先就是请求登录页面,然后读取Cookie值;再次请求登录页面并加入登录页所需的每个参数;最后就是请求最终所需的页面。当然在除第一次请求外其他的请求都需要附带上Cookie信息以便服务器能判断当前请求是否已经通过验证。说了这么多,可是如果你使用httpclient的话,你甚至连一行代码都无需增加,你只需要先传递登录信息执行登录过程,然后直接访问想要的页面,跟访问一个普通的页面没有任何区别,因为类HttpClient已经帮你做了所有该做的事情了,太棒了!下面的例子实现了这样一个访问的过程
* Created on
by skydong
package http.
import mons.httpclient.*;
import mons.httpclient.cookie.*;
import mons.httpclient.methods.*;
* 用来演示登录表单的示例
* @author skydong
public class FormLoginDemo ...{
static final String LOGON_SITE = &localhost&;
static final int
LOGON_PORT = 8080;
public static void main(String[] args) throws Exception...{
HttpClient client = new HttpClient();
client.getHostConfiguration().setHost(LOGON_SITE, LOGON_PORT);
//模拟登录页面login.jsp-&main.jsp
PostMethod post = new PostMethod(&/main.jsp&);
NameValuePair name = new NameValuePair(&name&, &ld&);
NameValuePair pass = new NameValuePair(&password&, &ld&);
post.setRequestBody(new NameValuePair[]...{name,pass});
int status = client.executeMethod(post);
System.out.println(post.getResponseBodyAsString());
post.releaseConnection();
//查看cookie信息
CookieSpec cookiespec = CookiePolicy.getDefaultSpec();
Cookie[] cookies = cookiespec.match(LOGON_SITE, LOGON_PORT, &/&, false, client.getState().getCookies());
if (cookies.length == 0) ...{
System.out.println(&None&);
} else ...{
for (int i = 0; i & cookies. i++) ...{
System.out.println(cookies[i].toString());
//访问所需的页面main2.jsp
GetMethod get = new GetMethod(&/main2.jsp&);
client.executeMethod(get);
System.out.println(get.getResponseBodyAsString());
get.releaseConnection();
其他类似问题
为您推荐:
httpclient的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁& & & & 有个朋友让我搞搞tornado框架,说实话,这个框架我用的不多。。。& & 我就把自己的一些个运维研发相关的例子,分享给大家。& & & & 怎么安装tornado,我想大家都懂。& & pip install tornado& & 再来说说他的一些个模块,官网有介绍的。我这里再啰嗦的复读机一下,里面掺夹我的理解。& & 主要模块& & web - FriendFeed 使用的基础 Web 框架,包含了 Tornado 的大多数重要的功能,反正你进入就对了。& & escape - XHTML, JSON, URL 的编码/解码方法& & database - 对 MySQLdb 的简单封装,使其更容易使用,是个orm的东西。& & template - 基于 Python 的 web 模板系统,类似jinja2& & httpclient - 非阻塞式 HTTP 客户端,它被设计用来和 web 及 httpserver 协同工作,这个类似加个urllib2& & auth - 第三方认证的实现(包括 Google OpenID/OAuth、Facebook Platform、Yahoo BBAuth、FriendFeed OpenID/OAuth、Twitter OAuth)& & locale - 针对本地化和翻译的支持& & options - 命令行和配置文件解析工具,针对服务器环境做了优化,接受参数的& & 底层模块& & httpserver - 服务于 web 模块的一个非常简单的 HTTP 服务器的实现& & iostream - 对非阻塞式的 socket 的简单封装,以方便常用读写操作& & ioloop - 核心的 I/O 循环& & 再来说说tornado接受请求的方式:& & 关于get的方式& & class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("You requested the main page") class niubi(tornado.web.RequestHandler):
def get(self, story_id):
self.write("xiaorui.cc niubi'id is " + story_id) application = tornado.web.Application([
(r"/", MainHandler),
(r"/niubi/([0-9]+)", niubi), ])& & 这样我们访问 /niubi/ 就会走niubi这个类,里面的get参数。& & 关于post的方式& & class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write('&html&&body&&form. action="/" method="post"&'
'&input type="text" name="message"&'
'&input type="submit" value="Submit"&'
'&/form&&/body&&/html&')
def post(self):
self.set_header("Content-Type", "text/plain")
self.write("xiaorui.cc and " + self.get_argument("message"))& & 在tornado里面,一般get和post都在一个访问路由里面的,只是按照不同method来区分相应的。& & 扯淡的完了,大家测试下get和post。& & import tornado.ioloop import tornado.web import json class hello(tornado.web.RequestHandler):
def get(self):
self.write('Hello,xiaorui.cc') class add(tornado.web.RequestHandler):
def post(self):
res = Add(json.loads(self.request.body))
self.write(json.dumps(res)) def Add(input):
sum = input['num1'] + input['num2']
result = {}
result['sum'] = sum
return result application = tornado.web.Application([
(r"/", hello),
(r"/add", add), ]) if __name__ == "__main__":
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()& & #大家可以写个form测试,也可以用curl -d测试& & 您可能感兴趣的文章:Python Web服务器Tornado使用小结tornado捕获和处理404错误的方法python为tornado添加recaptcha验证码功能tornado框架blog模块分析与使用Python(Tornado)模拟登录小米抢手机Web服务器框架 Tornado简介& & QQ空间
百度搜藏更多& & Tags:Tornado web框架& & 复制链接收藏本文打印本文关闭本文返回首页& & 上一篇:Django在Win7下的安装及创建项目hello word简明教程& & 下一篇:Web服务器框架 Tornado简介& & 相关文章python基础教程之python消息摘要算法使用示例Python sys.path详细介绍采用python实现简单QQ单用户机器人的方法python中定义结构体的方法python备份文件的脚本python实现bitmap数据结构详解vc6编写python扩展的方法分享python合并文本文件示例python实现多线程采集的2个代码例子sqlalchemy对象转dict的示例& & 文章评论& & 最 近 更 新& & Python实现同时兼容老版和新版Socket协议python使用正则表达式检测密码强度源码分pymssql ntext字段调用问题解决方法python生成指定尺寸缩略图的示例python实现的二叉树算法和kmp算法实例python 解析html之BeautifulSouppython基础教程之基本内置数据类型介绍Python不规范的日期字符串处理类python去掉字符串中重复字符的方法python求素数示例分享& & 热 点 排 行& & Python入门教程 超详细1小时学会python 中文乱码问题深入分析比较详细Python正则表达式操作指Python字符串的encode与decode研Python open读写文件实现脚本Python enumerate遍历数组示例应Python 深入理解yieldPython+Django在windows下的开发python 字符串split的用法分享python 文件和路径操作函数小结
声明:该文章系网友上传分享,此内容仅代表网友个人经验或观点,不代表本网站立场和观点;若未进行原创声明,则表明该文章系转载自互联网;若该文章内容涉嫌侵权,请及时向
相关经验教程
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.004 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益

我要回帖

更多关于 tornado tcp client 的文章

 

随机推荐