C-BlogServer博客-数据库以及验证码的解决
2015-09-03 00:00
369 查看
在第三章合并c并发的server服务器以及调用django的wsgi接口两部分内容后,只需要做django内部的编写就可以写出网站
这里mark一下使用pil的方法
apt-get install libjpeg8 libjpeg62-dev libfreetype6 libfreetype6-dev
ln -s /usr/lib/x86_64-linux-gnu/libjpeg.so /usr/lib
ln -s /usr/lib/x86_64-linux-gnu/libfreetype.so /usr/lib
ln -s /usr/lib/x86_64-linux-gnu/libz.so /usr/lib
ln -s /usr/include/freetype2 /usr/include/freetype
pip install PIL --allow-external PIL --allow-unverified PIL
可是事实上第三章只测试了静态html网页的可用性
在实际的blog网站中,遇到了一些问题
问题以及解决方案
1,数据库读写问题
使用我写的server服务器,第一个问题就出现在这,只要涉及到数据库的读写都会出现这个问题,根据提示我们不难发现是线程的问题,搜索一下没有什么合理的解决方案,尝试根据错误提示来查找问题的所在
DatabaseWrapper objects created in a thread can only be used in that same thread.
既然写着thread id,我们尝试在源程序中将所有创建的线程都printf出他的pid
不难发现,主线程和响应线程导致这个问题,怎么办呢,肯定将主线程中一些涉及到python数据库的代码转移到响应线程中
回到main函数,我们调用了两个python相关的函数,都是自己定义的方法,包括djangoinit和djangodestory(排除)
其中init方法里头
里面只有少数的方法,包括py环境初始化,设置工作目录,导入wsgi,再获取application方法
其实只有包导入和获取部分放到响应线程中完成即可
编译测试一下
可以正常打开网站了
这里头我们立马发现第二个问题
2,验证码无法显示
无法显示原因是什么的,单从浏览器很难看出来
利用chrome我们打开验证码图片链接
发现了错误原因
使用了重复的标头,这个怎么解决呢?
我们用fiddler来看传输的文本内容
不难发现在响应头部分
Content-length有两个,也就是说静态文件在django上会添加上响应头
然后实际上就算去掉重复的头,c根据wsgi接口得到的数据也只有9byte
用回python对接口调用
from mysite import wsgi
class HttpHandler:
status = None
body = None
def start_response(self,status, response_headers, exc_info=None):
self.status = str(status)
def HttpServer(self,method,path,req):
environ = {'REQUEST_METHOD':method,'SERVER_NAME':'BlogServer','QUERY_STRING':req,'SERVER_PORT':'80','PATH_INFO':path,'wsgi.input':''}
self.body = str(wsgi.application(environ,self.start_response))
def Run(self):
self.HttpServer('GET','/captcha/image/fa75e9edf75866e81e0146855d17345c92bcfe22/','')
return self.status+'\r\n'+self.body
print HttpHandler().Run()
显示的是完整图片的byte
问题在于c调用python时返回值,为什么是9byte
最后一位刚好是00,难道在c中把这一位当成\0终结?
强行复制内存,无效
依然打不开图片
虽然打不开图片,但修改一下排除掉重复标头可以正常访问一下
3,POST的header以及cookie等请求头并没有作为参数传参
这些问题在后续博客中继续研究
这里mark一下使用pil的方法
apt-get install libjpeg8 libjpeg62-dev libfreetype6 libfreetype6-dev
ln -s /usr/lib/x86_64-linux-gnu/libjpeg.so /usr/lib
ln -s /usr/lib/x86_64-linux-gnu/libfreetype.so /usr/lib
ln -s /usr/lib/x86_64-linux-gnu/libz.so /usr/lib
ln -s /usr/include/freetype2 /usr/include/freetype
pip install PIL --allow-external PIL --allow-unverified PIL
可是事实上第三章只测试了静态html网页的可用性
在实际的blog网站中,遇到了一些问题
问题以及解决方案
1,数据库读写问题
使用我写的server服务器,第一个问题就出现在这,只要涉及到数据库的读写都会出现这个问题,根据提示我们不难发现是线程的问题,搜索一下没有什么合理的解决方案,尝试根据错误提示来查找问题的所在
DatabaseWrapper objects created in a thread can only be used in that same thread.
既然写着thread id,我们尝试在源程序中将所有创建的线程都printf出他的pid
不难发现,主线程和响应线程导致这个问题,怎么办呢,肯定将主线程中一些涉及到python数据库的代码转移到响应线程中
回到main函数,我们调用了两个python相关的函数,都是自己定义的方法,包括djangoinit和djangodestory(排除)
其中init方法里头
里面只有少数的方法,包括py环境初始化,设置工作目录,导入wsgi,再获取application方法
其实只有包导入和获取部分放到响应线程中完成即可
编译测试一下
可以正常打开网站了
这里头我们立马发现第二个问题
2,验证码无法显示
无法显示原因是什么的,单从浏览器很难看出来
利用chrome我们打开验证码图片链接
发现了错误原因
使用了重复的标头,这个怎么解决呢?
我们用fiddler来看传输的文本内容
不难发现在响应头部分
Content-length有两个,也就是说静态文件在django上会添加上响应头
然后实际上就算去掉重复的头,c根据wsgi接口得到的数据也只有9byte
用回python对接口调用
from mysite import wsgi
class HttpHandler:
status = None
body = None
def start_response(self,status, response_headers, exc_info=None):
self.status = str(status)
def HttpServer(self,method,path,req):
environ = {'REQUEST_METHOD':method,'SERVER_NAME':'BlogServer','QUERY_STRING':req,'SERVER_PORT':'80','PATH_INFO':path,'wsgi.input':''}
self.body = str(wsgi.application(environ,self.start_response))
def Run(self):
self.HttpServer('GET','/captcha/image/fa75e9edf75866e81e0146855d17345c92bcfe22/','')
return self.status+'\r\n'+self.body
print HttpHandler().Run()
显示的是完整图片的byte
问题在于c调用python时返回值,为什么是9byte
最后一位刚好是00,难道在c中把这一位当成\0终结?
强行复制内存,无效
依然打不开图片
虽然打不开图片,但修改一下排除掉重复标头可以正常访问一下
3,POST的header以及cookie等请求头并没有作为参数传参
这些问题在后续博客中继续研究
相关文章推荐
- mysql简单例子
- sql学习(一)
- redis notes
- 把SQL Server Data Tools 开发的报表复制到 重新部署到 Microsoft Dynamics CRM 2015系统中...
- 把SQL Server Data Tools 开发的报表复制到 重新部署到 Microsoft Dynamics CRM 2015系统中
- MySQL常用命令
- Microsoft Dynamics CRM 2015 报表开发 入门 SQL Server Data Tools 开发
- Microsoft Dynamics CRM 2015 报表开发 入门 SQL Server Data Tools 开发
- MySQL学习笔记(3) - 查询服务器版本,当前时间,当前用户
- MySQL学习笔记(2) - 修改MySQL提示符的两种方法
- MySQL学习笔记(1) - cmd登陆和退出
- oracle 面试题做了做
- 我在设置MySQL远程连接时走的弯路
- MySQL(十)之权限管理和查询缓存
- MySQL(九)之MySQL存储引擎
- 如何复制assets中的数据库文件并访问数据库
- MySQL(八)之锁和事务特性
- jsp,servlet 连接c3p0数据库连接池是出现的问题
- mongodb 数据库用户管理
- Memcached内存管理分析