Dust8 的博客

读书百遍其义自见

0%

最近在用flask+mongodb做一个论坛,做了很久。有些体会和大家分享下。

  1. 学东西一定要仔细看文档,多看几遍;很多东西其实在文档里已经说明了的,

    不需要在去搜,而且不一定能搜到。
  2. 有些事去做的时候一定要专注。
  3. 有些时候人很容易钻牛角尖,可以试试放段时间再去解决。

Flask-MongoEngine


文档在http://flask-mongoengine.readthedocs.org/en/latest/

使用分页的时候报 xrange 错误,是因为在python3里面已经没有这个内置函数了,

可以把python里面的site-packages/flask_mongoengine/pagination.py里面的109行

的xrange改为range就可以了。

Flask-Login


文档在http://flask-login.readthedocs.org/en/latest/

这里有个中文翻译https://github.com/yinian1992/flask-login-docs-cn/blob/master/index.rst

在登录限制里和mongodb用时可以这样用,放在了models.py里

1
2
3
4
5
@login_manager.user_loader
def load_user(userid):
if userid is None:
return None
return User.objects(id=userid).first()

User是用户类,继承了flask.ext.login.UserMixin和flask.ext.mongoengine.MongoEngine的Document。

在视图里

1
2
from flask.ext.login import login_user
login_user(user)

函数里的user就是一个User类的实例。

jinja


flask默认的模板引擎是jinja。

我有个回复的list列表,要在模板里列出他的楼数。

python里可以这样:

1
2
3
l = ['a', 's']
for i, b in enumerate(l):
print(i, b)

就会输出

1
2
0 s
1 d

但是在模板里不方便这样。可以看jinja的文档 for http://jinja.pocoo.org/docs/templates/#for

variable 里的 loop.index 实现 以 1 开始的索引数。

flask-mail


官方文档:http://pythonhosted.org/flask-mail/

下面是用126邮箱的例子,126的文档

1
2
3
4
5
6
7
# email server
MAIL_SERVER = 'smtp.126.com'
MAIL_PORT = 465
MAIL_USE_TLS = False
MAIL_USE_SSL = True
MAIL_USERNAME = 邮箱用户名
MAIL_PASSWORD = 邮箱密码

是用app.config来配置,app=Flask(name)

文档有的就不说了,我来说说我碰到的问题。

1.说不在上下文中

需要 @copy_current_request_context ,

from flask import copy_current_request_context 引入。 而且还必须在路由视图里才有效,不然还会报其他错误。

2.smtplib报encode(‘ascii’)错

把764行的 msg = _fix_eols(msg).encode('ascii') 改为

msg = _fix_eols(msg).encode() , 他在python安装目录里面。

具体看他报错的信息吧。

最近换到 mac 下了,给 nexus 刷机记录下。

1.下载安装 fastboot 和 adb

task-adb-fastboot.zip或者去http://bbs.gfan.com/android-3945571-1-1.html下载。

把它解压出来有 4 个文件:adb-mac,adb-ubuntu,fastboot-mac,fastboot-ubuntu。

把 fastboot-mac 复制到/usr/local/bin 下并改名为 fastboot,在 task-adb-fastboot 的目录里,运行:

1
#sudo cp fastboot-mac /usr/local/bin/fastboot

把 adb-mac 复制到/usr/local/bin 下并改名为 adb,在 task-adb-fastboot 的目录里,运行:

1
#sudo cp adb-mac /usr/local/bin/adb

2.下载 nexus 官方包

https://developers.google.com/android/nexus/images

找到对应的包,下载下来并把它解压出来。

3.刷机

1)按住音量下不放,同时按住电源键,进入了 bootload

2)当然是连上电脑

3)打开终端,进入 nexus 官方包解压出来的目录里,输入

1
#./flash-all.sh

不用管它,等他刷完就可以了。

4.清空数据

1)开机会卡在开机画面,按住电源键不放,等它关机。

2)按住音量下不放,同时按住电源键,进入了 bootload

3)按音量键选择 Recovery mode, 在按电源一下

4)会出现有感叹号的倒地小绿人,在按下音量上键,就会进入 recovery

5)双清,用音量键选 wipe data/factory reset,在按电源,等它清完;

在选 wipe cache partition,在按电源,等它清完;

在选 reboot system now,在按电源,就会重启了。第一次比较慢,要好几分钟才进得去。

一直想从网页中提取所有的 顶级域名

我想要的 顶级域名 像这样的 “http://www.dust8.com”,

而 “http://www.dust8.com/archive“ 这类不要。

最近找到一个正则表达式还行。就是

1
http://(\w+\.){1,3}\w+

效果的话可以去找一些在线的正则表达式网站查看。

1
2
3
4
5
6
http://  就只是代表这几个字符
\w 是匹配任何字母数字字符;它相当于类 [a-zA-Z0-9]。
\. 是匹配 "." 这个字符; "\"是用来取消 "."的特殊意义的,
因为 "."用来匹配任意除换行符"\n"外的所有字符的
13} 是表示匹配前面的字符13
\w+ 表示匹配 [a-zA-Z0-9] 1次或无限次

现在https比较多了,听说可以防止偷窥,传输数据更安全。

所有前面的正则表达式可以改为:

1
2
(http|https)://(\w+\.){1,3}\w+    
| 代表它左右的表达式任意匹配一个

这样还不行,还是会把类似 “http://www.dust8.com/archive“ 这样的匹配出来, 改为这样:

1
2
(http|https)://(\w+\.){1,3}\w+$
$ 匹配字符串末尾

已经不错了。解决了上面这个问题。但是有的网页的网址是这样的:

http://www.dust8.com/“, 这类的匹配不了,再改:

1
(http|https)://(\w+\.){1,3}(\w+|\w+/)$

现在基本已经没发现什么问题,发现了在改。

下面是我用 python3 写的一个获取一个网址内所有的顶级域名代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import re
import urllib.request

from html.parser import HTMLParser


class YHTMLParser(HTMLParser):
def __init__(self):
HTMLParser.__init__(self)
self.urls = []
self.flag = False
self.pattern = re.compile("(http|https)://(\w+\.){1,3}(\w+|\w+/)$")

def handle_starttag(self, tag, attrs):
if tag == "a":
for attr in attrs:
if attr[0] == "href":
m = self.pattern.match(attr[1])
if m:
u = attr[1]
if u[-1] == "/":
u = attr[1][:-1]
if len(re.findall("\.", u)) == 1:
s = u.split("//")
u = s[0] + "//www." + s[1]

self.urls.append(u)

def getUrls(self):
return list(set(self.urls))


class UrlParser():
def __init__(self):
self.html = ""
self.urls = []

def getHtml(self, url):
req = urllib.request.Request(url)
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36')
try:
f = urllib.request.urlopen(req)
self.html = f.read().decode()
except:
self.html = ""

self.parserHtml()

def parserHtml(self):
yhtmlparser = YHTMLParser()
yhtmlparser.feed(self.html)
self.urls = yhtmlparser.getUrls()

def getUrls(self):
return self.urls


if __name__ == "__main__":
url = "http://www.the5fire.com/links/"
urlparser = UrlParser()
urlparser.getHtml(url)
u = urlparser.getUrls()
print("find", len(u), "links\n", u)

昨天把这个博客程序更新了下,居然出现静态文件未发现。

本地是没问题的,在vps里就有问题了。

在浏览器里查看源代码,点击css之类的会出现ngixn相关的

字样,应该是它没分配过来。但是我关于这部分的代码都没动过,

没理由更新前可以,更新后不行。

早上终于发现了一篇文章解决了这个问题

Nginx Tornado 站点配置遇到的一个问题,解决后我只想说卧槽

只要把 nginx 里关于静态文件的指派删除就好了。

就是那段

1
location ^~ /static/{}

重启 nginx,就好了,很无语。

ubuntu应该是最易用的桌面linux系统。

而现在unity是ubuntu默认的桌面。

unity里有个 more suggestions ,非常让人讨厌。就是这样的

unity-more-suggestions

想要去掉它,可以用 dconf Editor 修改设置。

dconf Editor 一般随系统就安装了,如果没有安装,就去软件中心安装。

修改的地方是 desktop >> unity >> lenses >> applications

applications 里的 display-available-apps的勾去掉就ok了。

如图:

display-available-apps

最后的效果如下:

unity-no-more-suggestions

强迫症,没办法。^_^。