FLASK开源项目--派生吧博客推介之四

这一部分主要介绍博客的数据库以及定义的常用的查询函数,这一部分代码主要在model.py里面。博客的数据库主要包含category,tag,tags,post,comment五张表。现在分别对这五张表以及相关的查询函数进行解析: category category(分类表),主要储存了博客的分类,表项只有id(自增)以及name(唯一). class Category(db.Model): __tablename__ = 'category' #表名 query_class = CategoryQuery #指定的查询类名 id = db.Column(db.Integer, primary_key=True) #id category_name = db.Column(db.String(200), unique=True) #name #下面的内容可以自由选择 def __init__(self, category_name): self.category_name = category_name def __repr__(self): return ' ' % self.category_name 查询只要定义了两个函数getall以及getcategory_id:getall()获取所有的分类,getcategory_id(id)获取指定id 的分类。 class CategoryQuery(BaseQuery): def getall(self): return self.all() def getcategory_id(self, id): return self.get(id) tags tags(文章标签映射表),主要存储了文章id与标签的id的对应关系,存储文章的时候,该表会自动进行更新。 article_tags = db.Table('tags', db.Column( 'tag_id', db.Integer, db.ForeignKey('tag.id')), db.Column( 'post_id', db.Integer, db.ForeignKey('post.id')), ) tag tag(标签表),主要存储了文章的标签,表只有id(自增)以及name。 class Tag(db.Model): __tablename__ = 'tag' #表名 query_class = TagQuery #指定的查询类名 id = db.Column(db.Integer, primary_key=True) #id name = db.Column(db.String(50)) #name def __init__(self, name): self.name = name def __repr__(self): return ' ' % self.name 查询只要定义了两个函数getall以及gettag_id:getall()获取所有的标签,gettag_id(id)获取指定id 的标签。 class TagQuery(BaseQuery): def getall(self): return self.all() def gettag_id(self, id): return self.get(id) post post(文章表),主要存储了博客的文章内容以及相关的分类以及标签信息,表只有id(自增)、post_content、post_title、post_create_time、view_num、comment_count、status、author_id、post_modified_time、category_id、post_name、tags_name(id,文章内容,文章标题,文章创建时间,阅读次数,评论数量,文章状态,作者id,文章修改时间,分类id,网址的缩写名称,标签名称)。 class Post(db.Model): __tablename__ = 'post' #表名 query_class = PostQuery #指定的查询类名 id = db.Column(db.Integer, primary_key=True) #id post_content = db.Column(db.Text) #文章内容 post_title = db.Column(db.String(100)) #文章标题 post_name = db.Column(db.String(200), unique=True) #文章的网址的缩写,主要用于文章的网址以便于SEO优化 post_create_time = db.Column(db.DateTime, default=datetime.utcnow) #文章创建时间 view_num = db.Column(db.Integer, default=0) #阅读次数 comment_count = db.Column(db.Integer, default=0) #评论次数 status = db.Column(db.Integer, default=1) #文章状态 author_id = db.Column(db.Integer, default=1) #作者id,默认是1 post_modified_time = db.Column(db.DateTime, default=datetime.utcnow) #文章的修改时间 category_id = db.Column(db.Integer, db.ForeignKey('category.id')) #类型id categorys = db.relationship('Category', backref=db.backref( 'posts', lazy='dynamic'), lazy='select') #定义与category表之间的关系 tags = db.relationship('Tag', secondary=article_tags, backref=db.backref('posts', lazy='dynamic')) #定义域tag表之间的关系 def __init__(self, tags, post_content, post_title, category_id, post_name, post_create_time=None, view_num=0, comment_count=0, status=1, author_id=1, post_modified_time=None): self.post_content = post_content self.post_title = post_title self.category_id = category_id self.post_name = post_name ...

阅读全文 »

FLASK开源项目--派生吧博客推介之三

这一部分主要对博客的源代码进行就解析,会分三次完成。首先看看代码主要有config.py,model.py,views.py,myapp.py这四个文件。


  • config.py


# -*- coding: utf-8 -*-

# configuration page num  每页的文章数

PER_PAGE = 10        

# configuration mysql

SQLALCHEMY_DATABASE_URI = "mysql://%s:%s@%s/%s"%('root','root','127.0.0.1','test')
# 密钥
SECRET_KEY = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'
# 管理界面的用户名和密码
USERNAME = 'admin'
PASSWORD = 'admin'
# 图片上传路径
UPLOAD_FOLDER = '/static/upload/'
#允许的图片类型

ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'])

配置文件里面主要设置了每页的文章数,数据库的相关信息:用户名、密码、地址、数据库名称,密钥,管理页面的用户名和密码,图片上传路径,允许的图片类型。

  • myapp.py

这里面的代码比较简单,主要是导入相应的模块,app运行的端口以及debug模式:


from flask import Flask
app = Flask(__name__)
app.config.from_object('config')
from views import *

if __name__ == '__main__':
 app.run(host='0.0.0.0', debug=True)


阅读全文 »

flask开源项目--派生吧博客推介之二

上一部分介绍了博客整个结构,这一部分主要介绍templates与static两大文件夹里面的内容。

首先来看下templates 的内容:

这是整个博客的所有的页面:

  • 404.html:错误页面,里面嵌入了公益寻人的js代码;
  • about.html:个人说明页面
  • category.html:分类目录的页面
  • editpost.html:文章编辑的页面
  • error.html:错误页面,里面会显示具体的错误信息,用于给调试使用;
  • foot.html:所有页面的页脚部分
  • head.html:所有页面的头的部分
  • index.html:博客的首页
  • layout.hml:页面的通用结构
  • login.html:登录页面
  • newpost.html:编写新文章的页面
  • post.html:单页文章的页面
  • search.html:搜索结果的页面
  • sider.html:所有页面的侧边栏
  • tag.html:标签页面

static文件夹内容:

css:包含页面所有的css

images:页面的所有使用的图片

js:页面所使用的js

kindeditor:富媒体文本编辑器的代码地址

upload:博客上传的图片的文件夹

这是这两大文件夹里面的内容,下一部分针对所有源码就行解析!

阅读全文 »

flask开源项目--派生吧博客推介之一

项目简介:

网址:www.pythonpub.com

代码地址:https://github.com/sixu05202004/flaskblog

项目是用于简单的个人博客,前端界面主要是拷贝了wordpress的主题:NeoEase

项目使用的技术与插件:


  • flask_sqlalchemy:是一个给你的应用添加 SQLALchemy 支持的 Flask 扩展。 它致力于简化在 Flask 中 SQLAlchemy 的 使用,提供了有用的默认值和额外的助手来更简单地完成日常任务。
  • flask_cache:缓存插件,可以用于提高网页的访问速度
  • Bootstrap:Twitter的著名的CSS/HTML框架
  • kindeditor:富文本编辑器


代码结构:

templates里面包含了很多网页模板:首页,文章页,标签页,分类页,搜索页等等,views.py包含很多的试图函数,config.py里面提供了一些基本的配置,model.py提供了基本的数据模型以及一些数据查询和处理的函数。

下一部分将会对源代码进行解析。


阅读全文 »

使用 gdb 调试 Python 进程

有时我们会想调试一个正在运行的Python进程,或者一个Python进程的coredump。例如现在遇到一个mod_wsgi的进程僵死了,不接受 请求,想看看究竟是运行到哪行Python代码呢?这时就需要祭出gdb这个神器了。 准备 1. 确认你的gdb版本是>=7,gdb从版本7开始支持对Python的debug。 (ref)

2.确认gdb连接的Python是所要debug的Python,否则请重新编译gdb。

方法: $ gdb (gdb) python >import sys >print sys.version >end 2.4.3 (#1, Sep 21 2011, 19:55:41)

[GCC 4.1.2 20080704 (Red Hat 4.1.2-51)] 在一些追求稳定的发行版(例如CentOS),Python的版本会较低,这时都会自己编译一个Python使用。而从源里安装的gdb会连接源里 Python的版本。例如在CentOS 5.4,源里的Python是2.4.3,从源安装的gdb也会连接到Python 2.4.3。 编译时注意,要把自己编译的Python路径加到PATH环境变量里,这样gdb configure的时候才会找到新版Python并连接。

3.下载libpython.py

如何Debug 假设要debug的进程号为1000 $ gdb -p 1000 使用此命令即可使gdb附加到进程。

载入libpython脚本 如果你的gdb是redhat或fedora等厂商修改过的,会有--python选项,使用此选项即可指定gdb启动时载入的Python扩展脚本(此 脚本是扩展gdb的,不是我们需要debug的脚本)。

$ gdb --python /path/to/libpython.py -p 1000 如果安装的是GNU的gdb,就需要打开gdb后手动载入libpython.py脚本 (gdb) python >import sys >sys.path.insert(0, '/path/to/libpython.py') >import libpython >end (gdb) 这时就可以使用py-bt命令打印当前线程的Python traceback了

libpython还提供很多命令,例如py-print打印变量,py-locals打印所有本地变量等等,详细可打开libpython.py查看。 一点经验 在gdb可以使用generate-core-file命令生成一个coredump文件。之后可以用gdb –core来打开coredump文件进行debug。避免一直attach住进程,可以快速重启恢复服务 gdb-heap是gdb的一个扩展。可以打印Python的内存使用情况

参考资料 DebuggingWithGdb EasierPythonDebugging Debugging with gdb (gdb documentation)

阅读全文 »

Sieve of Eratosthenes算法的代码

In mathematics, the Sieve of Eratosthenes (Greek: κόσκινον Ἐρατοσθένους) is a simple, ancient algorithm for finding all prime numbers up to a specified integer.[1] It works efficiently for the smaller primes (below 10 million).[2] It was created by Eratosthenes, an ancient Greek mathematician. However, none of his mathematical works survived—the sieve was described and attributed to Eratosthenes in the Introduction to Arithmetic by Nicomachus. A prime number is a natural number which has exactly two distinct natural number divisors: 1 and itself. [素数的定义是,一个仅能被1和本身整除的自然数]

To find all the prime numbers less than or equal to a given integer n by Eratosthenes' method:

[可以通过以下的埃拉托色尼筛选法寻求所有小于整数n的素数]

Create a list of consecutive integers from two to n: (2, 3, 4, ..., n).

[列出从2到n的一串连续自然数]

Initially, let p equal 2, the first prime number.

[开始,先把2当作第一个素数,并赋值给变量p]

Strike from the list all multiples of p less than or equal to n. (2p, 3p, 4p, etc.)

[将该列自然数中划掉p的倍数]

Find the first number remaining on the list after p (this number is the next prime); replace p with this number.

[将剩下的自然数按原来顺序重新组成新的一列,并将第一个数赋给变量p]

Repeat steps 3 and 4 until p2 is greater than n.

[重复第三第四步,直到p的平方大于n]

All the remaining numbers in the list are prime.

[剩下的自然数就是所有小于n的素数]

import math

limit=1000000000

L=[True]*limit

def seive(x):

    for i in xrange(x*2,limit,x):

        L[i]=False map(seive,[2])

map(seive,xrange(3,int(math.ceil(math.sqrt(limit))),2))

primer=[]

for i in xrange(2,limit):

    if L[i]: primer.append(i)

print primer

阅读全文 »

CentOS 5升级python版本(2.4>2.7)

日前在CentOS上搭建测试环境时候,遇到需要升级python版本的情况,于是就记录了整个升级的过程:

     在CentOS5中自带的Python版本是2.4,但是目前许多基于Python的应用软件要求的Python版本应要高于2.4。升级python版 本的时候千万不能卸载python 2.4,再安装python2.7,这样会有无穷无尽的麻烦,保守的方式是直接安装python2.7的源码包,也就是python两个版本共存。(因为 Centos里面有很多程序是依赖着python,所有最好不要尝试去卸载python2.4)。

(1)下载/安装python

下载Python2.7.2.tar.bz2(http://www.python.org/ftp/python/2.7.2/Python- 2.7.2.tar.bz2)

$tar jxvf Python2.7.2.tar.bz2 $cd Python2.7.2

$./configure $make && make install 自此,python2.7安装后路径默认是在/usr/local/lib/python2.7 查看Python版本: $ /usr/local/bin/python2.7 -V

(2)建立软连接,使系统默认的python指向python2.7

正常情况下即使python2.7安装成功后,系统默认指向的python仍然是2.4版本,考虑到yum是基于python2.4才能正常工作,不敢轻 易卸载。如何实现将系统默认的python指向到2.7版本呢?

mv /usr/bin/python /usr/bin/python.bak (或者rm -rf /usr/bin/python)

ln -s /usr/local/bin/python2.7 /usr/bin/python

检验python指向是否成功 python -V

(3) 解决系统python软链接指向python2.7版本后,yum不能正常工作 方法:

$vi /usr/bin/yum 将文本编辑显示的#/usr/bin/python修改为#/usr/bin/python2.4,保存修改即可

阅读全文 »

Project Euler 13解题报告

题目: Work out the first ten digits of the sum of the following one-hundred 50-digit numbers. 37107287533902102798797998220837590246510135740250 46376937677490009712648124896970078050417018260538 74324986199524741059474233309513058123726617309629 91942213363574161572522430563301811072406154908250 23067588207539346171171980310421047513778063246676 89261670696623633820136378418383684178734361726757 28112879812849979408065481931592621691275889832738 44274228917432520321923589422876796487670272189318 47451445736001306439091167216856844588711603153276 70386486105843025439939619828917593665686757934951 62176457141856560629502157223196586755079324193331 64906352462741904929101432445813822663347944758178 92575867718337217661963751590579239728245598838407 58203565325359399008402633568948830189458628227828 80181199384826282014278194139940567587151170094390 35398664372827112653829987240784473053190104293586 86515506006295864861532075273371959191420517255829 71693888707715466499115593487603532921714970056938 54370070576826684624621495650076471787294438377604 53282654108756828443191190634694037855217779295145 36123272525000296071075082563815656710885258350721 45876576172410976447339110607218265236877223636045 17423706905851860660448207621209813287860733969412 81142660418086830619328460811191061556940512689692 51934325451728388641918047049293215058642563049483 62467221648435076201727918039944693004732956340691 15732444386908125794514089057706229429197107928209 55037687525678773091862540744969844508330393682126 18336384825330154686196124348767681297534375946515 80386287592878490201521685554828717201219257766954 78182833757993103614740356856449095527097864797581 16726320100436897842553539920931837441497806860984 48403098129077791799088218795327364475675590848030 87086987551392711854517078544161852424320693150332 59959406895756536782107074926966537676326235447210 69793950679652694742597709739166693763042633987085 41052684708299085211399427365734116182760315001271 65378607361501080857009149939512557028198746004375 35829035317434717326932123578154982629742552737307 94953759765105305946966067683156574377167401875275 88902802571733229619176668713819931811048770190271 25267680276078003013678680992525463401061632866526 36270218540497705585629946580636237993140746255962 24074486908231174977792365466257246923322810917141 91430288197103288597806669760892938638285025333403 34413065578016127815921815005561868836468420090470 23053081172816430487623791969842487255036638784583 11487696932154902810424020138335124462181441773470 63783299490636259666498587618221225225512486764533 67720186971698544312419572409913959008952310058822 95548255300263520781532296796249481641953868218774 76085327132285723110424803456124867697064507995236 37774242535411291684276865538926205024910326572967 23701913275725675285653248258265463092207058596522 29798860272258331913126375147341994889534765745501 18495701454879288984856827726077713721403798879715 38298203783031473527721580348144513491373226651381 ...

阅读全文 »

project euler 7解题报告

problem 7: By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13. What is the 10001st prime number? 版本一: 最原始的解法,花费的时间大概要20分钟左右。 import time i=3 num=1 start=time.time() while 1: for j in range(2,i): if i%j==0: break elif j==i-1: num=num+1 break else: continue if num==10001: print i break i=i+1 end=time.time() print end-start 版本二: 优化后的解法,花费时间大概是55秒左右。 import time i=3 num=1 S=[2] length=len(S) start=time.time() while 1: for j in S[0:length/2+1]: if i%j==0: break elif j==S[length/2]: S.append(i) length=length+1 break else: continue if length==10001: print S[10000] break i=i+2 end=time.time() print end-start 版本三: 进一步优化的解法,减少每次需要相除的个数,时间可以优化到不到3秒。 import time, math i=3 num=1 S=[2] length=len(S) start=time.time() while 1: l=int(math.ceil(math.sqrt(length))) for j in S[0:l]: if i%j==0: break elif j==S[l-1]: S.append(i) length=length+1 break else: continue if length==10001: print S[10000] break i=i+2 end=time.time() print end-start import time, math def findprimefactor(num): primefactor=[2,3,5,7] i=9 while len(primefactor) num: flag=True q=int(math.sqrt(i)) k=0 while(primefactor[k] =q): p=primefactor[k] if not(i%p): flag=True break else: flag=False k+=1 if not flag: primefactor.append(i) i+=2 return primefactor if __name__=='__main__': start=time.time() result=findprimefactor(10001) print result[-1],"sec:",time.time()-start 版本四:利用埃拉托色尼选筛法来进行计算,花费的时间大概是0.8秒左右。 import math , time limit=200000 L=[True]*limit start=time.time() def seive(x): for i in xrange(x*2,limit,x): L[i]=False map(seive,[2]) map(seive,xrange(3,int(math.ceil(math.sqrt(limit))),2)) primer=[] for i in xrange(2,limit): if L[i]: primer.append(i) print primer[10000] print time.time()-start ...

阅读全文 »

Project Euler 3解题报告

题目:The prime factors of 13195 are 5, 7, 13 and 29.


What is the largest prime factor of the number 600851475143 ?


题目3:找出一个合数的最大质数因子
13195的质数因子有5,7,13和29.


600851475143的最大质数因子是多少?


<a href="http://projecteuler.net/problem=3" target="_blank">Project Euler problem 3</a>


版本一:


先找出素数,然后确定最大的素因数。时间大概为37秒左右,属于很自然的但是效率很低的方法



import time, math
def findprimefactor(maxnum):
primefactor=[2,3,5,7]
i=9
while i flag=True
q=int(math.sqrt(i))
k=0
while(primefactor[k] p=primefactor[k]
if not(i%p):
flag=True
break
else:
flag=False
k+=1
if not flag:
primefactor.append(i)
i+=2
return primefactor


if __name__=='__main__':
strart=time.time()
L=findprimefactor(775147)
for num in L[::-1]:
if 600851475143%num==0:
print num
break
else:
print 600851475143
print time.time()-strart



版本二:


这个方法是利用除2外所有的素因数都是奇数的特点来完成,简单而且效率很高,时间为0.002秒



import time
strart=time.time()
d, n = 3, 600851475143
while (d * d &amp;lt; n):
if n % d == 0:
n /= d
else: d += 2
print n
print time.time()-strart

阅读全文 »