Django关于站点管理Admin Site的常见问题解决方法

1. 改变django默认语言的方法?

仅需添加’django.middleware.locale.LocaleMiddlewar’到 MIDDLEWARE_CLASSES设置中,并确保它在’django.contrib.sessions.middleware.SessionMiddleware’* 之后* 。

2. 怎样将已有models加入到admin管理中?

本问题用实例演示,假如有个app叫做books,该app包里包含3个模块Publisher、Author和Book,以下是将该三个模块添加到admin管理中的步骤:

在“ books“ 目录下(“ mysite/books“ ),创建一个文件:“ admin.py“

在admin.py中输入以下代码

from django.contrib import admin

from mysite.books.models import Publisher, Author, Book

#以下3句,实现将模块添加到后台管理

admin.site.register(Publisher)

admin.site.register(Author)

admin.site.register(Book)

3) 重启服务器,刷新后台界面(比如http://127.0.0.1:8000/admin)发现添加成功

继续阅读Django关于站点管理Admin Site的常见问题解决方法

Python模拟登陆新浪微博并实现投票功能

上次发了一篇文章,题目叫做《Python使用cookielib和urllib2模拟登陆新浪微博并抓取数据》,里面的代码请不要怀疑,我测试过它是正确的。

新浪微博的模拟登陆,有个前提条件,你用新浪微博账号登陆的时候,新浪没有提示你输入验证码。若需要输入验证码,不好意思这里不作处理,你可以用以下几种方法解决验证码问题:
1、用图片识别软件识别,不过识别正确率会很低
2、登陆的时候如果需要验证码,我们的自己的程序就弹出验证码的图片,自己手工输入
3、外包给验证码输入公司,比如100元,把图片传过去,他给你送回文字结果10000个

程序运行到了后面,我提到urllib2里面的cookie已经存放了我们请求任何页面需要的数据,因此可以用urllib2请求任何页面、发微薄、投票实现任何事情,详细见如下代码,猥琐的分隔栏下面是新增的内容,为了方便,我把上次的代码一起贴出来了,代码注释很给力,大家可以看一看,本代码测试成功:

# coding=utf8
import urllib
import urllib2
import cookielib
import base64
import re
import json
import hashlib
import time
from django.template.defaultfilters import urlencode

# 获取一个保存cookie的对象
cj = cookielib.LWPCookieJar()
# 将一个保存cookie对象,和一个HTTP的cookie的处理器绑定
cookie_support = urllib2.HTTPCookieProcessor(cj)
# 创建一个opener,将保存了cookie的http处理器,还有设置一个handler用于处理http的URL的打开
opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)
# 将包含了cookie、http处理器、http的handler的资源和urllib2对象板顶在一起
urllib2.install_opener(opener)

postdata = {
    'entry': 'weibo',
    'gateway': '1',
    'from': '',
    'savestate': '7',
    'userticket': '1',
    'ssosimplelogin': '1',
    'vsnf': '1',
    'vsnval': '',
    'su': '',
    'service': 'miniblog',
    'servertime': '',
    'nonce': '',
    'pwencode': 'wsse',
    'sp': '',
    'encoding': 'UTF-8',
    'url': 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',
    'returntype': 'META'
}

def get_servertime():

    url = 'http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=dW5kZWZpbmVk&client=ssologin.js(v1.3.18)&_=1329806375939'
    data = urllib2.urlopen(url).read()
    p = re.compile('\((.*)\)')
    try:
        json_data = p.search(data).group(1)
        data = json.loads(json_data)
        servertime = str(data['servertime'])
        nonce = data['nonce']
        return servertime, nonce
    except:
        print 'Get severtime error!'
        return None

def get_pwd(pwd, servertime, nonce):
    pwd1 = hashlib.sha1(pwd).hexdigest()
    pwd2 = hashlib.sha1(pwd1).hexdigest()
    pwd3_ = pwd2 + servertime + nonce
    pwd3 = hashlib.sha1(pwd3_).hexdigest()
    return pwd3

def get_user(username):
    username_ = urllib.quote(username)
    username = base64.encodestring(username_)[:-1]
    return username

def main():
    username = 'www.crazyant.net'  # 微博账号
    pwd = 'xxx'  # 微博密码
    url = 'http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.3.18)'
    try:
        servertime, nonce = get_servertime()
    except:
        return
    global postdata
    postdata['servertime'] = servertime
    postdata['nonce'] = nonce
    postdata['su'] = get_user(username)
    postdata['sp'] = get_pwd(pwd, servertime, nonce)
    postdata = urllib.urlencode(postdata)
    headers = {'User-Agent':'Mozilla/5.0 (X11; Linux i686; rv:8.0) Gecko/20100101 Firefox/8.0'
               , 'Referer':'http://vote.weibo.com/vid=1890981'
               }
    
    # 到此已经能够使用urllib2请求新浪任何的内容,登陆成功
    req = urllib2.Request(
        url=url,
        data=postdata,
        headers=headers
    )
    result = urllib2.urlopen(req)
    text = result.read()
    # print text
    p = re.compile('location\.replace\(\'(.*?)\'\)')
    try:
        login_url = p.search(text).group(1)
        print login_url
        # print login_url
        urllib2.urlopen(login_url)
        print "login success"
    except:
        print 'Login error!'
    # 测试读取数据,下面的URL,可以换成任意的地址,都能把内容读取下来
    #---------------------------------------------------------
    # 以下为2012年7月25日21新增:
    # 对一个投票页面进行投票
    #---------------------------------------------------------
    # 首先请求一下投票页面,这样做只是为了该页面会返回cookie,我们要保存cookie
    res = urllib2.urlopen('http://vote.weibo.com/vid=1890981')
    # 分析了投票的流程,需要如下几个参数的值
    votedata = {
              'item':'1',
              'share':'1',
              'poll_id':'1890981',
              'poll_category':'0',
              '_t':'0'
    }
    # 原文的那个headers少了一项Referer,结果导致投票不成功,所以这里加上
    headers_more = {'User-Agent':'Mozilla/5.0 (X11; Linux i686; rv:8.0) Gecko/20100101 Firefox/8.0'
               , 'Referer':'http://vote.weibo.com/vid=1890981'
               }
    # 把投票的参数的值进行编码,用于urllib2请求的时候附带
    votedata = urllib.urlencode(votedata)
    # URL、数据、请求HTTP头,我们伪造了一个请求包
    req = urllib2.Request(
        url='http://vote.weibo.com/poll/joined',
        data=votedata,
        headers=headers_more
    )
    # 发出请求包,到页面看一看,投票OK
    result = urllib2.urlopen(req)
    # 把返回的内容存下来看看,其实这一步无必要了
    text = result.read()
    f = open('out.txt', 'w')
    f.write(text)
    print 'ok'
main()

 

Django中定制自己的User和Group管理模块(类似对admin的二次开发)

django的admin后台管理实在强大,其实对于普通模型来说倒没什么,关键是对于权限系统,比如User和Group的管理,它做的非常好,让人总是想要充分利用它本身的功能。

然而在admin后台上直接进行二次开发有很多不友好的地方,比如你如果简单的扩充了User表,却不能够在系统本身的User模型中管理添加的字段,这涉及到dj源码(修改源码绝对不是好主意)

因此必须得自己来写权限系统,其实这里我们是对django的contrib下面的auth进行接口编写,下面是示意图:

其实正是因为对Auth(包括User和Group)的增删改查和对Auth的使用(验证权限等)之间没有直接的关系,因此我们可以简单的把Django核心中的User和Group作为一个简单的模型来使用,比如对Group的添加、修改、删除等等。

而使用的时候,因为直接访问的还是核心,它并不知道我们偷偷的写了很多源码自己来操纵User和Group,一切皆数据,数据即中介,对User和Group的使用,知识对数据的简单访问而已。

思路已经理清,可以对User和Group做如下的操纵来实现自己的、类似于Admin站点管理的模块:我们要使用的,只是源码核心中的User和Group的模型类model,因此我们可以建立自己模型表单,哈哈,简单的访问该模型表单,我们就是对User和Group的数据进行操作,简单吧~。

django1.4设置模板路径和CSS,JS,image等路径的方法

对于DJANGO这类MVC框架来说,路径问题可以称为一个谜一样的东西,很多人因为对路径不知道如何处理而觉得MVC实在是云里雾里不知所云。

本文主要解决django中关于模板路径设置、CSS文件路径设置、JS文件路径设置、图片路径设置等常见问题。文中将templates和media(包含js、css、images目录)放到了项目目录的根目录,更具有一般性质。

设定模板路径

设置模板路径比较简单,只要在setting.py里面的TEMPLATE_DIRS选项里面加上这么一句话即可:

import os.path
TEMPLATE_DIRS = (
    os.path.join(os.path.dirname(__file__), '../templates').replace('\\','/'),   

)

 

这意味着,你可以在项目的根目录下面,建立一个templates目录,里面放你所有的模板

设定CSS/JS/IMAGES等路径

1、在setting.py里面,加入下面一句话,指定根目录下面的media路径:

STATIC_PATH= os.path.join(os.path.dirname(__file__), '../media').replace('\\','/')

 

2、在urls.py里面设定这么一句话,将请求CSS/JS/IMAGES的URL转到该地方

(r'^site_media/(?P<path>.*)$','django.views.static.serve',{'document_root':settings.STATIC_PATH}),

 

3、那么在我们的模板里面,现在已经可以用以下方法访问JS/CSS/IMAGES

<link href="/site_media/style/style.css" rel="stylesheet" type="text/css" />

 

该方法的一个优点是,不用详细设置JS、CSS、images三个不同的路径,只要设定一个,在模版文件里面,直接指定文件的子目录就可以了,比如图片和JS可以这么写:

<img src=’/site_media/images/a.jpg’>

<script src=’/site_media/js/s.js’> </script>

请看这里,我们并没有在urls.py中指定/site_media/images这样的路径。

Python使用cookielib和urllib2模拟登陆新浪微博并抓取数据

我们都知道HTTP是无连接的状态协议,但是客户端和服务器端需要保持一些相互信息,比如cookie,有了cookie,服务器才能知道刚才是这个用户登录了网站,才会给予客户端访问一些页面的权限。

用浏览器登录新浪微博,必须先登录,登陆成功后,打开其他的网页才能够访问。用程序登录新浪微博或其他验证网站,关键点也在于需要保存cookie,之后附带cookie再来访问网站,才能够达到效果。

这里就需要Python的cookielib和urllib2等的配合,将cookielib绑定到urllib2在一起,就能够在请求网页的时候附带cookie。

具体做法,首先第一步,用firefox的httpfox插件,在浏览器衷开始浏览新浪微博首页,然后登陆,从httpfox的记录中,查看每一步发送了那些数据请求了那个URL;之后再python里面,模拟这个过程,用urllib2.urlopen发送用户名密码到登陆页面,获取登陆后的cookie,之后访问其他页面,获取微博数据。

具体代码,来自豆瓣的一篇文章:地址

本人加了点注释,欢迎大家一起品尝该同学的完美代码:

 

# coding=utf8
import urllib
import urllib2
import cookielib
import base64
import re
import json
import hashlib

# 获取一个保存cookie的对象
cj = cookielib.LWPCookieJar()
# 将一个保存cookie对象,和一个HTTP的cookie的处理器绑定
cookie_support = urllib2.HTTPCookieProcessor(cj)
# 创建一个opener,将保存了cookie的http处理器,还有设置一个handler用于处理http的URL的打开
opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)
# 将包含了cookie、http处理器、http的handler的资源和urllib2对象板顶在一起
urllib2.install_opener(opener)

postdata = {
    'entry': 'weibo',
    'gateway': '1',
    'from': '',
    'savestate': '7',
    'userticket': '1',
    'ssosimplelogin': '1',
    'vsnf': '1',
    'vsnval': '',
    'su': '',
    'service': 'miniblog',
    'servertime': '',
    'nonce': '',
    'pwencode': 'wsse',
    'sp': '',
    'encoding': 'UTF-8',
    'url': 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',
    'returntype': 'META'
}

def get_servertime():

    url = 'http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=dW5kZWZpbmVk&client=ssologin.js(v1.3.18)&_=1329806375939'
    data = urllib2.urlopen(url).read()
    p = re.compile('\((.*)\)')
    try:
        json_data = p.search(data).group(1)
        data = json.loads(json_data)
        servertime = str(data['servertime'])
        nonce = data['nonce']
        return servertime, nonce
    except:
        print 'Get severtime error!'
        return None

def get_pwd(pwd, servertime, nonce):
    pwd1 = hashlib.sha1(pwd).hexdigest()
    pwd2 = hashlib.sha1(pwd1).hexdigest()
    pwd3_ = pwd2 + servertime + nonce
    pwd3 = hashlib.sha1(pwd3_).hexdigest()
    return pwd3

def get_user(username):
    username_ = urllib.quote(username)
    username = base64.encodestring(username_)[:-1]
    return username

def main():
    username = 'www.crazyant.net'  # 微博账号
    pwd = 'xxxx'  # 微博密码
    url = 'http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.3.18)'
    try:
        servertime, nonce = get_servertime()
    except:
        return
    global postdata
    postdata['servertime'] = servertime
    postdata['nonce'] = nonce
    postdata['su'] = get_user(username)
    postdata['sp'] = get_pwd(pwd, servertime, nonce)
    postdata = urllib.urlencode(postdata)
    headers = {'User-Agent':'Mozilla/5.0 (X11; Linux i686; rv:8.0) Gecko/20100101 Firefox/8.0'}
    # 其实到了这里,已经能够使用urllib2请求新浪任何的内容了,这里已经登陆成功了
    req = urllib2.Request(
        url=url,
        data=postdata,
        headers=headers
    )
    result = urllib2.urlopen(req)
    text = result.read()
    # print text
    p = re.compile('location\.replace\(\'(.*?)\'\)')
    try:
        login_url = p.search(text).group(1)
        print login_url
        # print login_url
        urllib2.urlopen(login_url)
        print "login success"
    except:
        print 'Login error!'
    # 测试读取数据,下面的URL,可以换成任意的地址,都能把内容读取下来
    req = urllib2.Request(url='http://e.weibo.com/aj/mblog/mbloglist?page=1&count=15&max_id=3463810566724276&pre_page=1&end_id=3458270641877724&pagebar=1&_k=134138430655960&uid=2383944094&_t=0&__rnd=1341384513840',)
    result = urllib2.urlopen(req)
    text = result.read()
    print len(result.read())
    # unicode(eval(b),"utf-8")
    print eval("u'''" + text + "'''") 
main()

其实获取了模拟登陆后的urllib2,可以做抓数据等任何事情,你甚至可以写一个多线程的爬虫来爬遍新浪微博,我一直有这个想法,可从来没有实现。如果您有什么进展,请联系我共同进步。

putty连接linux出现中文乱码的解决方法

1、在当前打开的putty界面的,上面栏上,右键弹出菜单,点击里面的Change Settings..

2、点击左侧菜单栏的Window下面的Appearance选项,然后点change,用于设置字体

打开Change…的菜单,显示的是字体设置,按照如下图设置:

点击确定

3、点击左侧菜单栏的translation,继续设置:

 

4、点击Apply,发现中文已经能够正常显示

eclipse远程发布代码的方法(SSH自动同步)

eclipse有个插件,叫做Eclipse Remote System Explorer (RSE),具体使用方法:

1、下载RSE

地址:http://download.eclipse.org/tm/downloads/drops/R-3.3.2-201202061000/

2、安装到eclipse(3.4版本以上)

解压RSE压缩包,直接把里面的内容复制到eclipse的根目录

3、打开eclipse

  • 新建-》项目-》RSE-》connection
  • 填入IP,名字

4、将eclipse的工作目录,切换到RSE

5、右键新建一个connection,然后输入IP地址

6、右键连接,然后输入用户名和密码,同步完成

7、在sftp files里面新建一个filter,里面输入过滤的文件夹路径,比如/home/crazyant

最后左边目录树,会出现服务器上相应的文件夹,可以直接编辑了

注:本文有www.crazyant.net原创,转载请注明出处。

python在linux下安装方法(解决旧版本冲突)

1.下载源代码 http://www.python.org/ftp/python/2.5.2/Python-2.5.2.tar.bz2

2.  安装

$ tar –jxvf Python-2.5.2.tar.bz2

$ cd Python-2.5.2

$ ./configure

$ make

$ make install

3. 测试

在命令行下输入python,出现python解释器即表示已经正确安装。

在suse10或rhel5(es5)下系统默认已经装了python但版本是2.4.x;本次安装后在shell中输入

#python

会发现显示结果:

# python

Python 2.4.3 (#1, Dec 11 2006, 11:38:52)

[GCC 4.1.1 20061130 (Red Hat 4.1.1-43)] on linux2

Type “help”, “copyright”, “credits” or “license” for more information.

>>>

版本还是2.4.x的

解决办法:

#cd /usr/bin

#ll |grep python   //查看该目录下python

#rm -rf python

#ln -s PREFIX/Python-2.5.2/python ./python  //PREFIX为你解压python的目录

#python

# python

Python 2.5.2 (#1, Dec 11 2006, 11:38:52)

[GCC 4.1.1 20061130 (Red Hat 4.1.1-43)] on linux2

Type “help”, “copyright”, “credits” or “license” for more information.

>>>

OK!问题解决!

Python关于apply的知识

今天用到了python apply的方法,感觉非常的好用。

python apply函数的具体的含义:

apply(function, args[, keywords])

函数用于当函数参数已经存在于一个元组或字典中时,间接地调用函数。args是一个包含将要提供给函数的按位置传递的参数的元组。如果省略了args,任何参数都不会被传递,kwargs是一个包含关键字参数的字典。

apply()的返回值就是func()的返回值,apply()的元祖参数是有序的,元素的顺序必须和func()形式参数的顺序一致,下面给几个例子来详细的说下:

  • 假设是执行没有带参数的方法

def say():
    print ‘say in’
apply(say)

输出的结果是’say in’

  • 函数只带元组的参数。

def say(a, b):
    print a, b
apply(say,(“hello”, “老王python”))

  • 函数带关键字参数。

def say(a=1,b=2):
    print a,b
def haha(**kw):
     # say(kw)
      apply(say,(),kw)
print haha(a=’a’,b=’b’)

输出的结果是:a,b

下面有个例子是apply的经典运用,他可以让你少写一些代码,多点时间陪陪朋友
地址是:
http://bbs.cnpythoner.com/viewthread.php?tid=139&extra=

该函数从2.3已经弃用,被call替代