使用的是Django 1.8,按照官方的教程上面敲代码。为了体验下Django并没有使用mysql数据库而是使用的sqlite3.在使用后台的时候报错标题的错误。
解决方案有两个
1. 使用pip安装Pytz $ pip install pytz
并重启服务
2. 在设置中将USE_TZ= False
具体关于该值的解释请参考Time_Zone
给自己定个小目标,例如先写个十年代码,然后考虑再写二十年!
使用的是Django 1.8,按照官方的教程上面敲代码。为了体验下Django并没有使用mysql数据库而是使用的sqlite3.在使用后台的时候报错标题的错误。
解决方案有两个
1. 使用pip安装Pytz $ pip install pytz
并重启服务
2. 在设置中将USE_TZ= False
具体关于该值的解释请参考Time_Zone
通常我们在写ASP.NET MVC 程序在新加数据模型对象时通常会配合EF提供的方法。
例如在添加文章时我们都使用类似下面两种方法来将文章添加到数据库:
//方法1
DbContext.Entry(article).State = EntityState.Added;
DbContext.SaveChanges\(\);
//方法2
DbContext.Article.Add(article);
DbContext.SaveChanges\(\);
可是上面两种方法有什么区别呢?
仅仅从上面的代码来看是没有区别的,要想了解其中的区别我们得看看`article`d的源码,为了简单起见我们将模型写的简单一点。
public class Article
{
public int Id { get; set; }
public User Author { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public int Status { get; set; }
}
public class User
{
public int Id { get; set; }
public string Name { get; set; }
}
上面模型中的文章包含作者字段,EF会自动在数据库中生成Author_Id字段,并且关联到User表中。
这个时候如果我们在新建文章的时候使用DbContext.Article.Add(article);
而且article对象的Author属性不为空时,那么EF总会在User表中新建一个对应的数据。而使用DbContext.Entry(article).State = EntityState.Added
方法时不会出现上述的问题。
引用老外的一句描述就是
When you use
dbContext.SomeEntitySet.Add(entityInstance);
the status for this and all its related entities/collections is set to added, whiledbContext.Entry(entityInstance).State = EntityState.Added;
adds also all the related entities/collections to the context but leaves them as unmodified. So if the entity that you are trying to create has a related entity (and it’s value its not null), when you use Add it will create a new object for that child entity, while with the other way it won’t.
JetBrains系的IDE是小猪除了VS使用最多的IDE了,包括phpstrom, pycharm,Idea等等。但是只从使用了windows10之后其中非方便的一个功能却用不了了,就是可以直接在编辑器内部的终端(terminal)直接输入命令来执行的窗口却无法输入了。
今天小猪来分享怎么解决这个问题。
1. 打开cmd。按win+R
2. 在打开的运行框中输入CMD。您将看到系统的命令行工具
3. 右击弹出的系统命令行工具左上角的c盘的小图标并在菜单中选择”属性”
4. 勾选上“使用旧版控制台(需要重新启动)”并确定
完成后重启IDE就可以啦。
原文地址:http://www.smallerpig.com/926.html
转载注明出处哦:
import django
print(django.get_version\(\)) # 1.8.2
1 |
|
django-admin startproject mysite
1 |
|
mysite/
manage.py
mysite/
init.py
settings.py
urls.py
wsgi.py
1 |
|
python manage.py migrate
1 |
|
python manage.py runserver 8080
1 |
|
python manage.py startapp polls
1 |
|
polls/
init.py
admin.py
migrations/
init.py
models.py
tests.py
views.py
1 |
|
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
class Choice(models.Model):
question = models.ForeignKey(Question)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
1 |
|
python manage.py makemigrations polls
1 |
|
BEGIN;
CREATE TABLE “polls_choice” (
“id” serial NOT NULL PRIMARY KEY,
“choice_text” varchar(200) NOT NULL,
“votes” integer NOT NULL
);
CREATE TABLE “polls_question” (
“id” serial NOT NULL PRIMARY KEY,
“question_text” varchar(200) NOT NULL,
“pub_date” timestamp with time zone NOT NULL
);
ALTER TABLE “polls_choice” ADD COLUMN “question_id” integer NOT NULL;
ALTER TABLE “polls_choice” ALTER COLUMN “question_id” DROP DEFAULT;
CREATE INDEX “polls_choice_7aa0f6ee” ON “polls_choice” (“question_id”);
ALTER TABLE “polls_choice”
ADD CONSTRAINT “polls_choice_question_id_246c99a640fbbd72_fk_polls_question_id”
FOREIGN KEY (“question_id”)
REFERENCES “polls_question” (“id”)
DEFERRABLE INITIALLY DEFERRED;
COMMIT;
1 |
|
from polls.models import Question, Choice
Question.objects.all()
[]
from django.utils import timezone
q = Question(question_text=”What’s new?”, pub_date=timezone.now())
q.save()
q.id
1
q.question_text
“What’s new?”
q.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=)
# Change values by changing the attributes, then calling save\(\).
>>> q.question_text = "What's up?"
>>> q.save\(\)
# objects.all\(\) displays all the questions in the database.
>>> Question.objects.all\(\)
[<Question: Question object>]
1 |
|
python manage.py createsuperuser
Username:admin
Email address:admin@example.com
password:
Password(again):
Superuser created successfully.
1 |
|
from django.contrib import admin
from .models import Question
admin.site.regitster(Question)
1 |
|
from django.contrib import admin
from .models import Question
class QuestionAdmin(admin.MOdelAdmin):
fields = ['pub_date', 'question_text']
admin.site.register(Question,QuestionAdmin)
1 |
|
class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
(None, {‘fields’: [‘question_text’]}),
(‘Date information’, {‘fields’: [‘pub_date’]}),
]
1 |
|
class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
(None, {‘fields’: [‘question_text’]}),
(‘Date information’, {‘fields’: [‘pub_date’], ‘classes’: [‘collapse’]}),
]
1 |
|
from django.contrib import admin
from .models import Choice, Question
class ChoiceInline(admin.StackedInline):
model = Choice
extra = 3
class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['question_text']}),
('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
]
inlines = [ChoiceInline]
admin.site.register(Question, QuestionAdmin)
1 |
|
class ChoiceInline(admin.TabularInline):
#...
1 |
|
class QuestionAdmin(admin.ModelAdmin):
# ...
list_display = ('question_text', 'pub_date', 'was_published_recently')
1 |
|
class Question(models.Model):
# ...
def was_published_recently(self):
return self.pub_date >= timezone.now\(\) - datetime.timedelta(days=1)
was_published_recently.admin_order_field = 'pub_date'
was_published_recently.boolean = True
was_published_recently.short_description = 'Published recently?'
可以使用list_filter
选项来增加右侧的过滤器。例如使用list_filter =['pub_date']
让系统自动的为我们生成”今天“,”最近7天“,”本月“,”本年“,”不限“等选项。
可以为列表的表头中添加搜索列,使用 search_fields
选项,例如使用search_fields = ['question_text']
选项来让列表中可以根据标题来搜索选项。
调整每一页显示的数量
我们都知道在生成url链接的时候,官方是推荐使用Url.Action()方法来生成的。框架会自动帮我们生成指定的url而且一般来说不会出错。小猪只从知道有这么个方法之后一直对它相见恨晚,特别是其能够通过优雅的代码生成指定的get参数。
可是今天小猪却在这个方法上面栽了个跟头……
原因是这样的:因为要在某个Area的控制器下生成不在该Area下的url。例如在admin的area下生成默认默认命名空间下的HomeController中的Index方法,小猪自然的想到使用代码Url.Action(“Index”,”Home”)来生成。可是生成的却是:/Admin/Home/Index。。为此小猪在area下面的路由注册了下面的方法:1
2
3
4
5
6context.MapRoute(
"home",
"Home/{action}",
new { controller = "Home", action = "Login" },
namespaces: new[] { "ConsoleProject.Controllers" }
);
这样貌似在该area下面生成Home控制器的url是没问题的。小猪也以为这个需求就这么结束了……
可是结果却是在原来的默认不在该area的url.action()方法都会生成该area下的url。这下蛋疼了。例如使用代码
@Url.Action(“Index”, “Console”, new { articleId = 343 })生成的链接竟然是:/Admin/Console/Index?articleId=343
谷歌了好一会才知道Url.Action()方法会自动使用第一个能够匹配的路由来生成URL。很显然area的路由注册是在本身的default路由之前的。这个可通过Global.asax的部分代码看出来:1
2
3
4
5
6
7
8protected void Application_Start\(\)
{
AreaRegistration.RegisterAllAreas\(\);
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
ControllerBuilder.Current.SetControllerFactory(new DefaultControllerFactory\(\));
}
而在新建area的时候会自动注册路由Admin_default:1
2
3
4
5context.MapRoute(
"Admin_default",
"Admin/{controller}/{action}/{id}",
new { controller = "Console", action = "Login", id = UrlParameter.Optional }
);
这个时候使用@Url.Action(“Index”, “Console”, new { articleId = 343 })生成的链接就是:/Admin/Console/Index?articleId=343。因为这个时候首先匹配的就是名称为Admin_default的路由。
不过有一个问题小猪搞不明白的是为啥只有在注册了home路由的时候才会这个问题。而默认仅有Admin_default的时候就没有这个问题了!
所以一开始使用注册新路由的方法只会使原来的项目更糟糕,需要修改大量原来使用Url.Action()方法的地方。
最终取消了所有自己注册的路由,只使用系统默认的两个路由,而在需要制定使用某个路由生成URL的时候使用Url.RouteUrl()方法:@Url.RouteUrl(“default”,new {controller = “Library”,action=”AnnouncementContent”,articleId=item.Id})
这样就只在需要“跨域”生成链接的时候稍微麻烦点,而不必要动整个项目了!
具体表现为:
1中文没问题,甚至日文也没问题,单单韩文输入有问题!
2普通的input或者textare输入没问题,到Ckeditor里就有问题!
3启用调试模式查看后台接受到的没问题,但一存到数据库就有问题!
解决方法:
一般因为使用ckeditor的原因,可能这个字段内容比较大,所以会将这个字段的数据库属性设置为text!只要将text类型设置成nvarchar(max)即可!
而一般为了考虑存储大小,在input里面输入的内容大小会做限制,而在mssql里面对应的字段都会设置成nvarchar。也就解释了上面表现的第二点。
网络中也建议了使用nvarchar(max)来取代text在mssql中的使用
http://stackoverflow.com/questions/834788/using-varcharmax-vs-text-on-sql-server
最近几年青春片真的是如洪水一样涌入影院.反正各种青春校园的爱情.就像是这篇文章中的作品中的一句话一样:这是个恋爱的季节,空气中充满了情侣的味道~
很庆幸这部片子我又没去电影院看。这种片子还是适合在电脑上一个人静静的欣赏,看到学校宿舍的疯狂,同学们一起喝酒的场景然后自己能够回想起当年也这么轻狂过,放肆过。可是转眼间已近而立之年。
引起小猪想写此文的起因还是作品中白露和秋水最终还是没走大一起。所以想对这件事情评论下。
虽然只是一部小说改编的电影,但是小说通常来源于生活,当秋水在五星级酒店里盯着柳青看时我就想这一定会发生什么事情。可能秋水当时没这么想,但是内心的深处总是会希望发生点什么。自己的女朋友白露是和柳青完全两个极端的人,当然会对眼前这个浓妆艳裹的姑娘产生好奇。学生嘛,有那么点心思也不难理解,最关键的是有没有条件让这件事情发展下去,如果有条件的话那就像作品的名字一样——万物生长!
所以在巧合的情况下他们在街上碰面,在烧烤摊巧遇。再到一大早柳青不知是故意还是有意的去找他帮忙,他都不会很有戒心的去拒绝别人,而是让这个“万物”生长。生长到一起去蹦极不告诉现任女朋友,生长到一起吃着烛光晚餐喝着红酒。可能他自己都没意识到自己的内心已经生长出一点其他东西,这个东西是他现任的女朋友无法接受的。谁让他在药店的门口说:你怎么“也”怀孕了。
最终的结果就是两个本来是无缝的感情却生长出了裂痕。
还有就是喜欢白露的表演方式,其素颜出镜还是能让我对她很是敬佩,相比于范爷浓妆艳裹下的表演,我还是更喜欢她的方式。对了,特地查了下演员的名字叫:齐溪
之前一直使用的是其他账号购买的公司服务器,但是这个其他账号因为开过了别的公司的发票,而现在阿里云的发票一个账号只能对应一个抬头,修改起来非常麻烦,所以只能单独申请一个账号来购买服务器了.正好赶上最近搞活动,经过企业认证的账号购买第一台服务器半价.果断准备这件事.
首先我想吐槽下阿里云的这次活动,明明说的是第一台半价,我想有这好事为什么不能多买几年,反正这玩意肯定是要买的.结果操作的时候才发现人家最多只让你买一年,超过一年的话连第一年都给你按照原价算.这算不算是欺骗消费者,在线等…挺急的…
整个搬迁过程中最关键的就是得保证数据不能丢失,这里再吐槽一下阿里云的ECS服务器不能账号间转移!如果可以像域名一样直接将产品转移到其他账户下的话也就不会这么多事了.不过那样的话我们就享受不到企业认证之后第一台半价的优惠了,O(∩_∩)O.
为了保证数据不丢失,我也是操碎了这颗玻璃心,咨询客服之后发现可以进行镜像分享的操作达到目的!.那真是太好了.这里再赞一下阿里云的客服.提交工单之后很快给出回应,在文字沟通不顺利的情况下还直接打电话过来沟通,包括上次小猪的域名备案过程中.有什么问题直接提交工单,客服都会很认真的对问题进行解答.
附上与客服的记录:
然后就是将原来的服务器的数据盘的数据都复制到系统盘,然后登陆阿里云后台制作镜像,分享给新的阿里云账号,新的阿里云账号创建ECS实例,创建时系统选择分享的镜像,然后付钱,进入新的服务器,.哎呀妈呀,一整个服务器和原来的一模一样啊.连之前没删掉的百度云关键都在呢,真是贴心.这样确实是省了很多事.一些基础的软件例如IIS SQLSERVER FTP等软件不需要安装不说,最关键的是我们之前的网站数据也可以完全的克隆过来.整个过程体验我给阿里云95分.还有5分不是对他不满意,而是希望继续给我们惊喜!
最后的问题就是数据库的问题了.因为当初在复制数据的时候mdf文件没有直接复制过来(没有挺掉数据库服务而无法复制),然后打开新服务器对应的库就是”恢复挂起”的状态.原因我猜就是因为找不到对应的Mdf文件.这时候只好手动将原服务器的mdf文件都下载到新服务器并放到对应的文件夹下,然后到网上找解决方法,看到这里说的可以使用sql语句:1
2alter database dbname
set online
来让对应的库恢复,可是我执行了该语句之后却给我了个错误:1
2
3
4
5
6
7
8消息 5120,级别 16,状态 101,第 1 行
无法打开物理文件“D:\www\Movies\Movies.mdf”。操作系统错误 5:“5(拒绝访问。)”。
消息 5120,级别 16,状态 101,第 1 行
无法打开物理文件“D:\www\Movies\Movies_log.ldf”。操作系统错误 5:“5(拒绝访问。)”。
消息 5181,级别 16,状态 5,第 1 行
无法重新启动数据库“Movies”。将恢复到以前的状态。
消息 5069,级别 16,状态 1,第 1 行
ALTER DATABASE 语句失败。
最后删除原来的库,使用SQL SERVER的附加数据库功能将mdf文件附加到服务器中.这样整个迁移过程就完成了.
接下来需要做的就是把对应的域名解析到新的服务器上面咯.!
本文对微信官方的JSSDK的python版中的代码进行讲解,并在最后给到了其对应的python3.*版本.
官方示例代码下载链接:http://demo.open.weixin.qq.com/jssdk/sample.zip
官方示例代码python版: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
import time
import random
import string
import hashlib
class Sign:
def __init__(self, jsapi_ticket, url):
self.ret = {
'nonceStr': self.__create_nonce_str\(\),
'jsapi_ticket': jsapi_ticket,
'timestamp': self.__create_timestamp\(\),
'url': url
}
def __create_nonce_str(self):
return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(15))
def __create_timestamp(self):
return int(time.time\(\))
def sign(self):
string = '&'.join(['%s=%s' % (key.lower\(\), self.ret[key]) for key in sorted(self.ret)])
print string
self.ret['signature'] = hashlib.sha1(string).hexdigest\(\)
return self.ret
if __name__ == '__main__':
# 注意 URL 一定要动态获取,不能 hardcode
sign = Sign('jsapi_ticket', 'http://example.com')
print sign.sign\(\)
可见代码其实非常少而且都挺简单.并没有什么高深的技术,只用到了4个模块的内容.time模块用来获取时间戳,random模块来生成随机字符串.string模块生成字符串,hashlib对数据进行sha1加密.
代码中只定义了一个类Sign,用来提供签名方法.在该类的构造函数中需要传入jsapi_ticket和url两个参数.利用这两个参数生成一个字典:ret.字典有4个键,分别为:
然后就是Sign类对外提供的签名方法sign(),在该方法中首先对ret字典进行排序并使用&串联.然后对他进行sha1加密,然后将结果赋值给ret字典的signature键.最后返回ret字典.至此,整个生成验证过程结束.
其中判断name 属性的代码:1
2
3
4
5
if __name__ == '__main__':
# 注意 URL 一定要动态获取,不能 hardcode
sign = Sign('jsapi_ticket', 'http://example.com')
print sign.sign\(\)
作用为如果是在命令行条件下执行的话则执行这段代码,如果是其他环境下则不执行这段代码.
几年前一开始接触ASP.NET MVC框架的时候就被它所吸引.相对于web form真的是太方便了.完全的逻辑和视图分离!而作为偏服务器端的我不需要过多的前端知识却能和前端无缝对接.简直就是神器嘛.
用了差不多两年了,也陆续接触了CI和Django.发现虽然都是声称符合MVC思想的框架,但是仔细想想还是会发现其中的区别.
其主要区别可能是在Model上面,最熟悉的ASP.NET MVC中,model只是数据模型,而真正呈现的是视图模型.而CI,Django等框架,可能是使用Php,python等弱类型语言的原因.其框架中并没有明确的视图模型的概念.另外最大的区别在于在其他MVC框架中,数据都是从Model直接获取的,也就是说最复杂的逻辑有可能出现在Model里,其担负着与数据库连接,取数据等操作.但是在ASP.NET MVC中,我们所定义的也只能是数据的模型,而不能在模型中定义过多的数据库连接之类.
所以我一直认为ASP.NET MVC因为其model的原因并不算是真正符合MVC思想的.
附上维基百科对MVC的链接https://zh.wikipedia.org/wiki/MVC
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true