Archive for web-2

有点无语哇,没有基础直接“跑”就是这种结果。前面写的一篇《django发送json数据并格式化datetime时间数据》,今天晚上用ie8突然发现哇T_T,Date没转换过来,急哭了。原因是前面测试很长时间是在ubuntu下做的,这次回家了,用的windows。发现测试很重要。 正题:是转换的日期字符串格式不正确。开始群里告诉我是浏览器的原因,还真找到几篇文章,但发现没用。重新搜索javascript 的Date参数格式,挨个在两个浏览器里的控制台测试,终于找到了。。。T_T泪奔~ 再次搜索python strftime 格式化,修改。测试。通过了~\(≧▽≦)/~ 记录: 几种datetime格式,测试了第一个,并使用:

var someDate=new Date("Month dd,yyyy hh:mm:ss");
var someDate=new Date("Month dd,yyyy")
var someDate=new Date(yy,mm,dd,hh,mm,ss)
var someDate=new Date(GMT milliseconds from 1/1/1970)
strftime 格式化记录,防止再次搜索: %a 星期几的简写 Weekday name, abbr. %A 星期几的全称 Weekday name, full %b 月分的简写 Month name, abbr. %B 月份的全称 Month name, full %c 标准的日期的时间串 Complete date and time representation %d 十进制表示的每月的第几天 Day of the month %H 24小时制的小时 Hour (24-hour clock) %I 12小时制的小时 Hour (12-hour clock) %j 十进制表示的每年的第几天 Day of the year %m 十进制表示的月份 Month number %M 十时制表示的分钟数 Minute number %S 十进制的秒数 Second number %U 第年的第几周,把星期日做为第一天(值从0到53)Week number (Sunday first weekday) %w 十进制表示的星期几(值从0到6,星期天为0)weekday number %W 每年的第几周,把星期一做为第一天(值从0到53) Week number (Monday first weekday) %x 标准的日期串 Complete date representation (e.g. 13/01/08) %X 标准的时间串 Complete time representation (e.g. 17:02:10) %y 不带世纪的十进制年份(值从0到99)Year number within century %Y 带世纪部分的十制年份 Year number %z,%Z 时区名称,如果不能得到时区名称则返回空字符。Name of time zone %% 百分号

Continue

正确查询语句: articles_list = Articles.objects.filter(group__in= group_list).order_by('-id')[0:16] group_list是一个group对象列表。开始,用的下面这个查询语句: articles_list = Articles.objects.filter(group  in  group_list).order_by('-id')[0:16] 发现不行,然后想用for循环,然后将QuerySet进行合并。搜索没有找到好用的方法进行QuerySet的合并。 查看官方文档,Django QuerySet API 帮助文档:https://docs.djangoproject.com/en/1.3/ref/models/querysets/ 发现正确方法。其实可以想到,像gt,lt等的用法可以想象到in的用法。

Continue

用了一个javascript的插件,json传送过来的时间需要是Date对象类型的开始的思路就错了,以为可以直接返回这种类型的数据。差,天真了。后来又看到直接返回含有js语句的json文本,非常不喜欢。就想能不能转成js中Date能识别的格式,哈哈果然有。方法如下: 我用的 ,用json也行哇。views.py里的代码

from django.utils import simplejson

 li = []
    for a in articles:
        article={}
	article["start"] = a.datetime.strftime('%Y-%m-%dT%H:%M:%S')
        article["content"] = a.content
        li.append(article)
    json = simplejson.dumps(li)
    return HttpResponse(json)
其中strftime('%Y-%m-%dT%H:%M:%S') 是格式化为Date对象格式的字符串,方便在浏览器的javascript中转换为Date对象. html文件比较简单判断json的长度 循环变成Date对象,jsvascript
var i=0;
for(i=0;idjango发送json数据并格式化datetime时间数据风波二

Continue

World-writable config file '/etc/mysql/my.cnf' is ignored 在修改mysql 字符编码的时候,修改了文件的权限为777,然后就出现这个问题。解决方法是把文件权限再设置回来就搞定了 sudochmod 644 my.cnf 不在root下操作真的很麻烦,很多时候忘记用sudo命令。唉~

Continue

每次都要重新搜索,所以这次直接copy过来了,以后就不用找了. 一、连接MYSQL。 格式: mysql -h主机地址 -u用户名 -p用户密码 1、连接到本机上的MYSQL。 首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root -p,回车后提示你输密码.注意用户名前可以有空格也可以没有空格,但是密码前必须没有空格,否则让你重新输入密码. 如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中了,MYSQL的提示符是: mysql> 2、连接到远程主机上的MYSQL。假设远程主机的IP为:110.110.110.110,用户名为root,密码为abcd123。则键入以下命令: mysql -h110.110.110.110 -u root -p 123;(注:u与root之间可以不用加空格,其它也一样) 3、退出MYSQL命令: exit (回车) 二、修改密码。 格式:mysqladmin -u用户名 -p旧密码 password 新密码 1、给root加个密码ab12。首先在DOS下进入目录mysql\bin,然后键入以下命令 mysqladmin -u root -password ab12 注:因为开始时root没有密码,所以-p旧密码一项就可以省略了。 2、再将root的密码改为djg345。 mysqladmin -u root -p ab12 password djg345 三、增加新用户。 (注意:和上面不同,下面的因为是MYSQL环境中的命令,所以后面都带一个分号作为命令结束符) 格式:grant select on 数据库.* to 用户名@登录主机 identified by “密码” 1、增加一个用户test1密码为abc,让他可以在任何主机上登录,并对所有数据库有查询、插入、修改、删除的权限。首先用root用户连入MYSQL,然后键入以下命令: grant select,insert,update,delete on *.* to [email=test1@”%]test1@”%[/email]” Identified by “abc”; 但增加的用户是十分危险的,你想如某个人知道test1的密码,那么他就可以在internet上的任何一台电脑上登录你的mysql数据库并对你的数据可以为所欲为了,解决办法见2。 2、增加一个用户test2密码为abc,让他只可以在localhost上登录,并可以对数据库mydb进行查询、插入、修改、删除的操作(localhost指本地主机,即MYSQL数据库所在的那台主机), 这样用户即使用知道test2的密码,他也无法从internet上直接访问数据库,只能通过MYSQL主机上的web页来访问了。 grant select,insert,update,delete on mydb.* to [email=test2@localhost]test2@localhost[/email] identified by “abc”; 如果你不想test2有密码,可以再打一个命令将密码消掉。 grant select,insert,update,delete on mydb.* to [email=test2@localhost]test2@localhost[/email] identified by “”; 下篇我是MYSQL中有关数据库方面的操作。注意:你必须首先登录到MYSQL中,以下操作都是在MYSQL的提示符下进行的,而且每个命令以分号结束。 一、操作技巧 1、如果你打命令时,回车后发现忘记加分号,你无须重打一遍命令,只要打个分号回车就可以了。 也就是说你可以把一个完整的命令分成几行来打,完后用分号作结束标志就OK。 2、你可以使用光标上下键调出以前的命令。 二、显示命令 1、显示当前数据库服务器中的数据库列表: mysql> SHOW DATABASES; 注意:mysql库里面有MYSQL的系统信息,我们改密码和新增用户,实际上就是用这个库进行操作。 2、显示数据库中的数据表: mysql> USE 库名; mysql> SHOW TABLES; 3、显示数据表的结构: mysql> DESCRIBE 表名; 4、建立数据库: mysql> CREATE DATABASE 库名; 5、建立数据表: mysql> USE 库名; mysql> CREATE TABLE 表名 (字段名 VARCHAR(20), 字段名 CHAR(1)); 6、删除数据库: mysql> DROP DATABASE 库名; 7、删除数据表: mysql> DROP TABLE 表名; 8、将表中记录清空: mysql> DELETE FROM 表名; 9、显示表中的记录: mysql> SELECT * FROM 表名; 10、往表中插入记录: mysql> INSERT INTO 表名 VALUES (”hyq”,”M”); 11、更新表中数据: mysql-> UPDATE 表名 SET 字段名1=’a',字段名2=’b’ WHERE 字段名3=’c'; 12、用文本方式将数据装入数据表中: mysql> LOAD DATA LOCAL INFILE “D:/mysql.txt” INTO TABLE 表名; 13、导入.sql文件命令: mysql> USE 数据库名; mysql> SOURCE d:/mysql.sql; 14、命令行修改root密码: mysql> UPDATE mysql.user SET password=PASSWORD(’新密码’) WHERE User=’root’; mysql> FLUSH PRIVILEGES; 15、显示use的数据库名: mysql> SELECT DATABASE(); 16、显示当前的user: mysql> SELECT USER(); 三、一个建库和建表以及插入数据的实例 drop database if exists school; //如果存在SCHOOL则删除 create database school; //建立库SCHOOL use school; //打开库SCHOOL create table teacher //建立表TEACHER ( id int(3) auto_increment not null primary key, name char(10) not null, address varchar(50) default ‘深圳’, year date ); //建表结束 //以下为插入字段 insert into teacher values(”,’allen’,'大连一中’,'1976-10-10′); insert into teacher values(”,’jack’,'大连二中’,'1975-12-23′); 如果你在mysql提示符键入上面的命令也可以,但不方便调试。 (1)你可以将以上命令原样写入一个文本文件中,假设为school.sql,然后复制到c:\\下,并在DOS状态进入目录[url=file://\\mysql\\bin]\\mysql\\bin[/url],然后键入以下命令: mysql -uroot -p密码 < c:\\school.sql 如果成功,空出一行无任何显示;如有错误,会有提示。(以上命令已经调试,你只要将//的注释去掉即可使用)。 (2)或者进入命令行后使用 mysql> source c:\\school.sql; 也可以将school.sql文件导入数据库中。 四、将文本数据转到数据库中 1、文本数据应符合的格式:字段数据之间用tab键隔开,null值用[url=file://\\n]\\n[/url]来代替.例: 3 rose 大连二中 1976-10-10 4 mike 大连一中 1975-12-23 假设你把这两组数据存为school.txt文件,放在c盘根目录下。 2、数据传入命令 load data local infile “c:\\school.txt” into table 表名; 注意:你最好将文件复制到[url=file://\\mysql\\bin]\\mysql\\bin[/url]目录下,并且要先用use命令打表所在的库。 五、备份数据库:(命令在DOS的[url=file://\\mysql\\bin]\\mysql\\bin[/url]目录下执行) 1.导出整个数据库 导出文件默认是存在mysql\bin目录下 mysqldump -u 用户名 -p 数据库名 > 导出的文件名 mysqldump -u user_name -p123456 database_name > outfile_name.sql 2.导出一个表 mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名 mysqldump -u user_name -p database_name table_name > outfile_name.sql 3.导出一个数据库结构 mysqldump -u user_name -p -d –add-drop-table database_name > outfile_name.sql -d 没有数据 –add-drop-table 在每个create语句之前增加一个drop table 4.带语言参数导出 mysqldump -uroot -p –default-character-set=latin1 –set-charset=gbk –skip-opt database_name > outfile_name.sql

Continue

以前写的乱了 ,这次转到ubuntu下,又重新装了一次。重新记录: 1.apache安装。apt-get install apache2 2.mod_wsgi安装。sudo apt-get install libapache2-mod-wsgi 3.mysql安装。sudo apt-get install mysql-server 4.python-mysql安装。sudo apt-get install python-mysqldb 5.django 安装 先到官网下载然后按照官网的方法安装 tar xzvf Django-1.3.1.tar.gz cd Django-1.3.1 sudo python setup.py install  

Ubuntu PIL安装Python Imaging Library

http://0x55aa.sinaapp.com/linux/307.html

ubuntu Apache+mod_wsgi错误提示

http://0x55aa.sinaapp.com/linux/303.html

Ubuntu安装配置Apache和mod_wsgi

http://0x55aa.sinaapp.com/linux/267.html

Ubuntu下mysql数据库的编码修改

http://0x55aa.sinaapp.com/linux/305.html  

Continue

在网上找到一篇文章《将django的管理端控件用到前端页面》,写得很详细。自己还需要时间的设定,就粗略的研究了一下django后台admin的时间控件的设置使用。 forms.py文件

from django.contrib.admin import widgets

linetime = forms.DateTimeField(required=True,label='时间',widget=widgets.AdminDateWidget())
head中增加如下代码
 
 



{{ form.media }}
{{ form.media }}添加了两条script语句。 body中添加{{ form.linetime }} widgets.py文件中的几个def: AdminDateWidget,这个是只有日期的时候,在froms中使用。 AdminTimeWidget,这个在只有时间。 AdminSplitDateTime,这个时间和日期都有,按情况选择就OK了。

Continue

models.py里的写法: link = models.ImageField(upload_to='pic/' ,blank=True,null=True) forms.py里的写法: image = forms.ImageField(required=False)# required = false 不是必填项 template里的写法: <form enctype="multipart/form-data" method='post' action='.'>{% csrf_token %} 其中生成的表单是name=“image”,见forms views.py里的写法,没写完,只是实现了上传和缩略图功能:

if request.method == 'POST':
        form = AddArticlesForm(request.POST,request.FILES)
        #如果用户提交的表单数据验证合法
        if form.is_valid():

        if 'image' in request.FILES:
                image = request.FILES["image"]
                #debug()
                img= Image.open(image)
                img.thumbnail((250,250),Image.ANTIALIAS)
                
                url='pic/'+image.name
                name= 'E:/django/plant/media/'+url
                img.save(name,"jpeg")
                pic = Pic(articles=newarticle,
                      link=url,
                      )
                pic.save()

Continue

查了些验证码的资料,选了一个比较简单的例子,参照着写得不是很好。找了一篇比较经典的收藏了。

TFontAngle=range($this->TFontAngle[0],$this->TFontAngle[1]);
		$this->TFontSize=range($this->TFontSize[0],$this->TFontSize[1]);

		$arr=array();
		$Chars=$this->Chars;
		$TFontAngle=$this->TFontAngle;
		$TFontSize=$this->TFontSize;
		$FontColors=$this->FontColors;
		$code="";
		$font=dirname(__FILE__)."/font/".$this->TFonts[0];

		$charlen=strlen($Chars)-1;
		$anglelen=count($TFontAngle)-1; // 角度范围
		$fontsizelen=count($TFontSize)-1; // 角度范围
		$fontcolorlen=count($FontColors)-1; // 角度范围

		for($i=0;$i<$this->Length;$i++) ///得到字符与颜色
		{
			$char=$Chars[rand(0,$charlen)]; ///得到字符
			$angle=$TFontAngle[rand(0,$anglelen)]; ///旋转角度
			$fontsize=$TFontSize[rand(0,$fontsizelen)]; ///字体大小
			$fontcolor=$FontColors[rand(0,$fontcolorlen)]; ///字体大小

			$bound=$this->_calculateTextBox($fontsize,$angle,$font,$char); ///得到范围

			$arr[]=array($fontsize,$angle,$fontcolor,$char,$font,$bound);  ///得到矩形框
			$code.=$char;
		}
		$this->Code=$arr; //验证码
		return $code;
	}

	public function Draw() ///画图
	{
		if(empty($this->Code)) $this->RandRSI();
		$codes=$this->Code; ///用户验证码


		$wh=$this->_getImageWH($codes);

		$width=$wh[0];
		$height=$wh[1]; ///高度

		$this->Width=$width;
		$this->Height=$height;

		$this->Image = imageCreate( $width, $height );
		$image=$this->Image;

		$back = $this->_getColor2($this->_getColor( $this->BgColor)); ///背景颜色
		imageFilledRectangle($image, 0, 0, $width, $height, $back); ///填充背景

		$TPadden=$this->TPadden;

		$basex=$this->Txbase;
		$color=null;
		foreach ($codes as $v) ///逐个画字符
		{
			$bound=$v[5];
			$color=$this->_getColor2($this->_getColor($v[2]));
			imagettftext($image, $v[0], $v[1], $basex, $bound['height'],$color , $v[4], $v[3]);
			$basex=$basex+$bound['width']*$TPadden-$bound['left'];///计算下一个左边距
		}
		$this->TLine?$this->_wirteSinLine($color,$basex):null; ///画干扰线
		header("Content-type: image/png");
		imagepng( $image);
		imagedestroy($image);

	}

	/**
	 *通过字体角度得到字体矩形宽度*
	 *
	 * @param int $font_size 字体尺寸
	 * @param float $font_angle 旋转角度
	 * @param string $font_file 字体文件路径
	 * @param string $text 写入字符
	 * @return array 返回长宽高
	 */
	private function _calculateTextBox($font_size, $font_angle, $font_file, $text) {
		$box = imagettfbbox($font_size, $font_angle, $font_file, $text);

		$min_x = min(array($box[0], $box[2], $box[4], $box[6]));
		$max_x = max(array($box[0], $box[2], $box[4], $box[6]));
		$min_y = min(array($box[1], $box[3], $box[5], $box[7]));
		$max_y = max(array($box[1], $box[3], $box[5], $box[7]));

		return array(
		'left' => ($min_x >= -1) ? -abs($min_x + 1) : abs($min_x + 2),
		'top' => abs($min_y),
		'width' => $max_x - $min_x,
		'height' => $max_y - $min_y,
		'box' => $box
		);
	}

	private function  _getColor( $color ) //#ffffff
	{
		return array(hexdec($color[1].$color[2]),hexdec($color[3].$color[4]),hexdec($color[5].$color[6]));
	}

	private function  _getColor2( $color ) //#ffffff
	{
		return imagecolorallocate ($this->Image, $color[0], $color[1], $color[2]);
	}

	private function _getImageWH($data)
	{
		$TPadden=$this->TPadden;
		$w=$this->Txbase;
		$h=0;
		foreach ($data as $v)
		{
			$w=$w+$v[5]['width']*$TPadden-$v[5]['left'];
			$h=$h>$v[5]['height']?$h:$v[5]['height'];
		}
		return array(max($w,$this->Width),max($h,$this->Height));
	}

	//画正弦干扰线
	private function _wirteSinLine($color,$w)
	{
		$img=$this->Image;

		$h=$this->Height;
		$h1=rand(-5,5);
		$h2=rand(-1,1);
		$w2=rand(10,15);
		$h3=rand(4,6);

		for($i=-$w/2;$i<$w/2;$i=$i+0.1)
		{
			$y=$h/$h3*sin($i/$w2)+$h/2+$h1;
			imagesetpixel($img,$i+$w/2,$y,$color);
			$h2!=0?imagesetpixel($img,$i+$w/2,$y+$h2,$color):null;
		}
	}
}
DEMO:
$rsi = new Utils_Caption();
$rsi->TFontSize=array(15,17);
$rsi->Width=50;
$rsi->Height=25;
$code = $rsi->RandRSI();
session_start();
$_SESSION["CHECKCODE"] = $code;
$rsi->Draw();
以上代码下载地址是:http://files.cnblogs.com/chengmo/caption_chengmo.zip 作者:chengmo QQ:8292669 出处:http://www.cnblogs.com/chengmo 本文版权归作者和博客园共有,欢迎转载,请务必添加原文链接。

Continue

下面是从网上找的的,先记录: 在apache1.3.x中, 使用gzip来对内容进行压缩. 在新版的apache2.x里, deflate模块代替了gzip模块,用于对内容进行压缩. 查看Apache是否有deflate这个模块,目录:/etc/apache2/mods-available/ 启用这个mod:sudo a2enmod deflate 编辑deflate的配置文件: /etc/apache2/mods-available/deflate.conf 官网:http://httpd.apache.org/docs/2.0/mod/mod_deflate.html 一篇关于Apache优化的文章:http://my.oschina.net/lamp2me/blog/15317 默认Apache是所有插件都启用了,在配置文件apache2中可以看到,就不用启用了。

Continue