爬坑小集锦第二期

开场白

很不幸,爬坑小集锦第二期这么快就面世了,短短的几天又爬了好几个坑,顿时整个人都不好了,Orz。

话说近期秘密这种树洞类应用火得一塌糊涂,秘密比传统的树洞多了一个功能:提问让好友匿名回答,或许这个就是这类应用吸引眼球的地方吧。网上开始有一堆文章开始夸这类应用的划时代意义了,但我觉得,现在这个阶段只能称之为时事热点,再下个阶段才能算流行,至于划时代还为时过早。引用Paul Graham的一句话:“人们真正注意到你的时候,不是第一眼看到你站在那里,而是发现过了这么久你居然还在这里。”(喂喂!这篇日志的主题是爬坑好吗!)

Q1 : JQuery如何匹配使用选择器选择同时拥有多个CSS样式的元素?

通过查阅JQuery的文档可知,匹配同时存在多个CSS样式的元素的选择器的语法是$("样式1样式2样式3"),也就是每个样式都连起来。下面是一个例子。

<!--假设有如下一个元素-->
<div class='style1 style2 style3'></div>

<script>
  // 通过选择器来选择它,
  // 选择器中样式的顺序不会影响选择的结果
  $('.style1.style2.style3').text('Here I am!');
</script>

如果你真的点开文档那个链接,你可能还找不到上面这个例子所说的情况,官方的例子在这里,我其实是在w3school上找到的,上面对JQ的选择器的使用做了一个很好的总结。JQ的选择器那么强大,强烈推荐一看。

这里要注意不要跟多重选择的选择器混起来,多重选择的选择器语法是这样的$('样式1, 样式2, 样式3')。一开始我以为这是我所要的东西,后来点入文档的详细页面,看了例子才发现这个选择器是用来选择含有样式1或样式2或样式3的元素。=_=||不要被Multiple这个单词给欺骗了。

总结一下,当要选择同时拥有多个样式的元素时,即“与”的情况,使用$('样式1样式2样式3')这种类型;当要选择含有任一一个指定样式的元素时,即“或”的情况,使用$('样式1, 样式2, 样式3')这种类型。

Q2 : Flask中如何获取请求页面的主机地址?

request对象中有一个属性:remote_addr,它的值就是远程计算机的IP地址。

request对象还有一个叫user_agent的属性,这个属性记录了请求这个页面的浏览器的更多信息,如使用什么浏览器,内核版本,使得的操作系统等。

Q3 : HTML中如何处理表单提交事件?

提出这个问题,充分暴露了我前端知识的匮乏。HTML中,表单提交事件是onSubmit,支持这个事件的只有form标签。网上有很多人问为什么设置了onSubmit事件,点击按钮的时候却没有运行对应的函数呢?很多就是没有注意到这个标签只适用于form标签这点,而将onSubmit事件设置在了button上。

HTML里支持的事件有这些

Q4 : 使用Flask-SQLAlchemy拓展时,SQLite数据库的地址链接的书写格式是怎样的?

SQLite数据地址链接的书写格式有两种,一种是绝对路径,一种是相对路径,如下:

# 绝对路径
sqlite:////absolute/path/to/database.db
# 相对路径
sqlite:///relative/path/to/database.db

只要把绝对路径里'sqlite:////'的最后一个“/”理解为Linux中的根目录,便能理解绝对路径为什么是四条斜杠了。这样,只需要记住'sqlite:///'就足够了。

Q5 : SQLite中如何查看数据库中有多少张表以及表结构?

SQLite中,查看数据库有多少张表的命令为:(以下命令在sqlite程序之中运行)

.tables

查看表的结构的命令为:

.schema TABLE

TABLE是表名,这个命令打印出了表的创建语句,从语句可以清楚的看到表的内部结构。

这两个命令在Mysql中的对应语句分别是:

show tables;

和:

show columns from TABLE;

TABLE是表名,这个命令打印出了表的内部结构,而不是创建表的语句。

Q6 : Python中调用json模块输出json字符串时,如何解决中文输出的问题?

在输出的语句中指定不使用ascii编码即可:

# 指定不使用ASCII编码,
# 并设置缩进格式为2空格
# (格式化输出后更适合人类阅读)
json.dumps(data, ensure_ascii=False, indent=2)

Q7 : 为何我的使用了SQLite的Web应用,在调试环境下运行得好好的,一旦上了服务器正式环境就运行出错呢?

我的情况是这样的,在存储数据库的时候,存储数据库的语句在正式环境下就会出错,而在调试环境和本地开发环境中却不会出现问题。

这个问题花费了我很多时间调试程序,最后肯定的是代码没有问题,差点归结为服务器闹鬼了。后来想到,读取数据库的时候没有问题,存储到数据库才出现问题,有可能是因为没有拥有对数据库的写入权限导致的。进入数据库所在的文件夹,执行“ls -al”,发现数据库文件的拥有者和组别与运行程序应用的用户的角色身份不一致,导致程序没有写入数据库的权限,因此在存储数据的时候报错。

# 执行以下命令改变数据库的所有者身份
# 使器拥有者为www-data(运行程序的用户为www-data)
chown www-data 数据库

程序对数据库有访问、修改权限之后,再也不会报错了。[破涕为笑]

在Windows系统中,文件权限的影响不大,但在Linux中,要时常注意这个问题。

结束语

此次的爬坑之旅,我深刻的体认到生命不息,Debug不止的人生真谛。[困]

写完这篇日志已经2点40分了,祝还没睡的程序猿和通过搜索引擎找到这篇文章的人Debug愉快。先睡了。

That's all, BUT NOT ALL!