以下是小编精心整理的使用Python的Django框架实现事务交易管理的教程,本文共7篇,供大家阅读参考。

篇1:使用Python的Django框架实现事务交易管理的教程
这篇文章主要介绍了使用Python的Django框架实现事务交易管理的教程,针对数据库的事务行为进行一系列操作,要的朋友可以参考下
如果你花费了很多的时间去进行Django数据库事务处理的话,你将会了解到这是让人晕头转向的,
在过去,只是提供了简单的基础文档,要想清楚知道它是怎么使用的,还必须要通过创建和执行Django的事务处理。
这里有众多的Django事务处理的名词,例如:commit_on_success , commit_manually , commit_unless_maneged,rollback_unless_managed,enter_transaction_management,leace_transaction_management,这些只是其中的一部分而已。
最让人感到幸运的是,Django 1.6版本发布后。现在你可以紧紧使用几个函数就可以实现事务处理了,在我们进入学习这些函数的几秒之前。首先,我们要明确下面这些问题:
什么是事务处理呢?
Django 1.6中的出现了那些新的事物处理优先权?
在进入“要怎么才是Django 1.6版本中正确的事务处理”之前,请先了解一下下面的详细案例:
带状案例
事务
推荐的方式
使用分隔符
每一个HTTP请求事务
保存点
嵌套的事务
事务是什么?
根据SQL-92所说,“一个SQL事务(有时简称为事务)是一个可以原子性恢复的SQL语句执行序列”。换句话说,所有的SQL语句一起执行和提交。同样的,当回滚时,所有语句也一并回滚。
例如:
# STARTnote = Note(title=“my first note”, text=“Yay!”)note = Note(title=“my second note”, text=“Whee!”)address1.saveaddress2.save()# COMMIT
所以一个事务是 数据库中单个的工作单元。它是由一个start transaction开始和一个commit或者显式的rollback结束。
Django 1.6之前的事务管理有什么问题?
为了完整地回答这个问题,我们必须阐述一下事务在数据库、客户端以及Django中是如何处理的。
数据库
数据库中的每一条语句都运行在一个事务中,这个事务甚至可以只包含一条语句。
几乎所有的数据库都有一个AUTOCOMMIT设置,通常它被默认设置为True。AUTOCOMMIT将所有语句包装到一个事务里,只要语句成功执行,这个事务就立即被提交。当然你也可以手动调用START_TRANSACTION,它会暂时将AUTOCOMMIT挂起,直到你调用COMMIT_TRANSACTION或者ROLLBACK。
然后,这种方式将会使AUTOCOMMIT设置的作用于每条语句后的隐式提交失效。
然而,有诸如像sqlite3和mysqldb的python客户端库,它允许python程序与数据库本身相连接。这些库遵循一套如何访问与查询数据库的标准。该DB API 2.0标准,被描述在PEP 249之中。虽然它可能让人阅读稍干一些。一个重要带走的是,在PEP 249状态之中,默认数据库应该关闭自动提交功能。
这明显与数据库内发生了什么矛盾冲突:
数据库语句总是要在一个事务中运行。此数据库一般会为你打开自动提交功能。
不过,根据PEP 249,这不应该发生。
客户端库必须反映在数据库之中发生了什么?但由于他们不允许默认打开自动提交功能。他们只是简单地在一个事务中包裹sql语句。就像数据库。
好啦,在我身边呆久一些吧。
Django
进入Django,Django也有关于事务处理的话要说。在Django 1.5和更早的版本。当你写数据到数据库时,Django基本上是运行一个开放的事务和自动提交该事务功能。所以每次你所称谓的像诸如model.save() 或者model.update()的东西,Django生成相应的sql语句,并提交该事务。
也有在Django 1.5和更早的版本,它是建议你使用TransactionMiddleware绑定http请求事务。每个请求提供了一个事务。如果返回的响应没有异常,Django会提交此事务。但如果你的视图功能抛出一个错误,回滚将被调用。这实际上说明,它关闭了自动提交功能。如果你想要标准化,数据库级别自动提交风格式的事务管理,你必须管理你自己的交易-通常是通过使用事务装饰你的视图功能,例如@transaction.commit_manually,或者@transaction.commit_on_success.
吸一口气,或者两口。
这意味着什么?
是啊,在那儿有许多事情要做,而事实证明,大多数开发者正需要这个标准数据库级的自动提交功能-有意义的事务往往是留在幕后处理的。做你自己的事,直到你需要手动调整他们。
在Django 1.6版本之中,什么是正确关于事务管理呢?
现在,欢迎来到Django 1.6.尽力忘掉一切吧,我们只是谈论而已,只是记得在Django 1.6中,你可以使用数据库,需要时可以手动自动提交和管理事务。从本质上来说,我们有一个更简单的模型,基本上是要把设计什么样的数据库摆在首位。
好啦!大功告成,让我们写代码吧?
Stripe案例
下面,我们使用处理一个用户注册的例子,调用了Stripe来处理信用卡进程。
def register(request): user = None if request.method == ‘POST‘: form. = UserForm(request.POST) if form.is_valid(): customer = Customer.create(“subscription”, email = form.cleaned_data[‘email‘], description = form.cleaned_data[‘name‘], card = form.cleaned_data[‘stripe_token‘], plan=“gold”,) cd = form.cleaned_datatry: user = User.create(cd[‘name‘], cd[‘email‘], cd[‘password‘], cd[‘last_4_digits‘]) if customer: user.stripe_id = customer.id user.save() else: UnpaidUsers(email=cd[‘email‘]).save() except IntegrityError: form.addError(cd[‘email‘] + ‘ is already a member‘)else: request.session[‘user‘] = user.pk return HttpResponseRedirect(‘/‘) else: form. = UserForm() return render_to_response( ‘register.html‘, { ‘form‘: form, ‘months‘: range(1, 12), ‘publishable‘: settings.STRIPE_PUBLISHABLE, ‘soon‘: soon(), ‘user‘: user, ‘years‘: range(, 2036), }, context_instance=RequestContext(request) )
例子首先调用了Customer.create,实际上就是调用Stripe来处理信用卡进程,然后我们创建一个新用户。如果我们得到来自Stripe的响应,我们就用stripe_id更新新创建的用户。如果我们没有得到响应(Stripe已关闭),我们将用新创建用户的email向UnpaidUsers表增加一个新条目,这样我们可以让他们稍后重试他们信用卡信息。
思路是这样的:如果Stripe没有响应,用户依然可以注册,然后开始使用我们的网站。我们将在稍后的时候让用户提供信用卡的信息。
“我明白这是一个特殊的例子,并且这也不是我想完成的功能的方式,但是它的目的是展示交易”
考虑交易,牢记住在Django1.6中提供了对于数据库的“AUTOCOMMIT”功能。接下来看一下数据库相关的代码:
cd = form.cleaned_datatry: user = User.create(cd[‘name‘], cd[‘email‘], cd[‘password‘], cd[‘last_4_digits‘]) if customer: user.stripe_id = customer.id user.save() else: UnpaidUsers(email=cd[‘email‘]).save() except IntegrityError:
你能发现问题了吗?如果“UnpaidUsers(email=cd[‘email‘]).save()” 运行失败,会发生什么?
有一个用户,注册了系统;然后系统认为已经核对过信用卡了。但是事实上,系统并没有核对过。
我们仅仅想得到其中一种结果:
1.在数据库中创建了用户,并有了stripe_id
2.在数据库中创建了用户,但是没有stripe_id。同时在相关的“UnpaidUsers”行,存有相同的邮件地址
这就意味着,我们想要的是分开的数据库语句头完成任务或者回滚。这个例子很好的说明了这个交易。
首先,我们写一些测试用例来验证事情是否按照我们想象的方式运行:
@mock.patch(‘payments.models.UnpaidUsers.save‘, side_effect = IntegrityError)def test_registering_user_when_strip_is_down_all_or_nothing(self, save_mock): #create the request used to test the view self.request.session = {} self.request.method=‘POST‘ self.request.POST = {‘email‘ : ‘python@rocks.com‘, ‘name‘ : ‘pyRock‘, ‘stripe_token‘ : ‘...‘, ‘last_4_digits‘ : ‘4242‘, ‘password‘ : ‘bad_password‘, ‘ver_password‘ : ‘bad_password‘,} #mock out stripe and ask it to throw a connection error with mock.patch(‘stripe.Customer.create‘, side_effect = socket.error(“can‘t connect to stripe”)) as stripe_mock: #run the test resp = register(self.request) #assert there is no record in the database without stripe id. users = User.objects.filter(email=“python@rocks.com”) self.assertEquals(len(users), 0) #check the associated table also didn‘t get updated unpaid = UnpaidUsers.objects.filter(email=“python@rocks.com”) self.assertEquals(len(unpaid), 0)
当我们尝试去保存“UnpaidUsers”,测试上方的解释器就会跑出异常‘IntegrityError‘ 。
接下来是解释这个问题的答案,“当“UnpaidUsers(email=cd[‘email‘]).save()”运行的时候到底发生了什么?” 下面一段代码创建了一段对话,我们需要在注册函数中给出一些合适的信息。然后“with mock.patch” 会强制系统去认为Stripe没响应,最终就跳到我们的测试用例中。
resp = register(self.request)
上面这段话仅仅是调用我们的注册视图去传递请求。然后我们仅仅需要去核对表是否有更新:
#assert there is no record in the database without stripe_id.users = User.objects.filter(email=“python@rocks.com”)self.assertEquals(len(users), 0) #check the associated table also didn‘t get updatedunpaid = UnpaidUsers.objects.filter(email=“python@rocks.com”)self.assertEquals(len(unpaid), 0)
所以如果我们运行了测试用例,那么它就该运行失败:
======================================================================FAIL: test_registering_user_when_strip_is_down_all_or_nothing (tests.payments.testViews.RegisterPageTests)----------------------------------------------------------------------Traceback (most recent call last): File “/Users/j1z0/.virtualenvs/django_1.6/lib/python2.7/site-packages/mock.py”, line 1201, in patched return func(*args, **keywargs) File “/Users/j1z0/Code/RealPython/mvp_for_Adv_Python_Web_Book/tests/payments/testViews.py”, line 266, in test_registering_user_when_strip_is_down_all_or_nothing self.assertEquals(len(users), 0)AssertionError: 1 != 0 ----------------------------------------------------------------------
赞,
这就是我们最终想要的结果。
记住:我们这里已经练习了“测试驱动开发”的能力。错误信息提示我们:用户信息已经被保存到数据库中,但是这个并不是我们想要的,因为我们并没有付费!
事务交易用于挽救这样问题 ...
事务
对于Django1.6,有很多种方式来创建事务。
这里简单介绍几种。
推荐的方法
依据Django1.6的文档,“Django提供了一种简单的API去控制数据库的事务交易...原子操作用来定义数据库事务的属性。原子操作允许我们在数据库保证的前提下,创建一堆代码。如果这些代码被成功的执行,所对应的改变也会提交到数据库中。如果有异常发生,那么操作就会回滚。”
原子操作可以被用于解释操作或者是内容管理。所以如果我们用作为内容管理的时候,我们的注册函数的代码就会如下:
from django.db import transaction try: with transaction.atomic(): user = User.create(cd[‘name‘], cd[‘email‘], cd[‘password‘], cd[‘last_4_digits‘]) if customer:user.stripe_id = customer.iduser.save() else:UnpaidUsers(email=cd[‘email‘]).save() except IntegrityError: form.addError(cd[‘email‘] + ‘ is already a member‘)
注意在“with transaction.atomic()”这一行。这块代码将会在事务内部执行。所以如果我们重新运行了我们的测试,他们都将会通过。
记住:事务是一个工作单元,所以当“UnpaidUsers”调用失败的时候,内容管理的所有操作都会被一起回滚。
使用装饰器
除了上面的做法,我们能使用Python的装饰器特性来使用事务。
@transaction.atomic():def register(request): ...snip.... try: user = User.create(cd[‘name‘], cd[‘email‘], cd[‘password‘], cd[‘last_4_digits‘]) if customer:user.stripe_id = customer.iduser.save() else: UnpaidUsers(email=cd[‘email‘]).save() except IntegrityError: form.addError(cd[‘email‘] + ‘ is already a member‘)
如果我们重新跑一次测试,那还是会一样失败。
为啥呢?为啥事务没有正确回滚呢?原因在与transaction.atomic会尝试捕获某种异常,而我们代码里人肉捕抓了(例如 try-except 代码块里的IntegrityError 异常),所以 transaction.atomic 永远看不到这个异常,所以标准的AUTOCOMMIT 流程就此无效掉。
但是,删掉try-catch语句会导致异常没有捕获,然后代码流程十有八九会就此乱掉。所以啊,也就是说不能去掉try-catch。
所以,技巧是将原子上下文管理器放入我们在第一个解决方案中的 try-catch 代码段里。
再看一下正确的代码:
from django.db import transaction try: with transaction.atomic(): user = User.create(cd[‘name‘], cd[‘email‘], cd[‘password‘], cd[‘last_4_digits‘]) if customer:user.stripe_id = customer.iduser.save() else:UnpaidUsers(email=cd[‘email‘]).save() except IntegrityError: form.addError(cd[‘email‘] + ‘ is already a member‘)
当 UnpaidUsers 触发 IntegrityError 时,上下文管理器 transaction.atomic() 会捕获到它,并执行回滚操作。此时我们的代码在异常处理中执行(即行 theform.addErrorline),将会完成回滚操作,并且,如果必要的话,也可以安全的进行数据库调用。也要注意:任何在上下文管理器 thetransaction.atomic() 前后的数据库调用都不会受到它的执行结果的影响。
针对每次HTTP请求的事务交易
Django1.5和1.6版本都允许用户操作请求事务模式。在这种模式下,Django会自动在事务中,处理你的视图函数。如果视图函数抛出异常,Django会自动回滚事务;否则Django会提交事务。
为了实现这个功能,你需要在你想要有此功能的数据库的配置中,设置“ATOMIC_REQUEST”为真。所以在我们的“settings.py”需要有如下设置:
DATABASES = { ‘default‘: { ‘ENGINE‘: ‘django.db.backends.sqlite3‘, ‘NAME‘: os.path.join(SITE_ROOT, ‘test.db‘), ‘ATOMIC_REQUEST‘: True, }}
如果我们把解释器放到视图函数中,以上设置就会生效。所以这并没有符合我们的想法。
但是,这里依然值得注意的是解释器:“ATOMIC_REQUESTS”和“@transaction.atomic”仍然会有可能在有异常抛出的时候,处理这些错误。为了去捕捉这些错误,你需要去完成一些常规的中间件,或者需要去覆盖“urls.hadler500”,或者是创建新的“500.html”模板。
保存点
尽管事务是有原子性的,但还是能够打散为多个“保存点”――你可看作是“部分事务”。
例如,你有个事务包含了4条SQL语句,你可以在第二个SQL之后创建一个保存点。一旦保存点创建成功,就算第三条或第四条SQL执行失败,你仍旧能够做一个部分回滚,忽视后面两条SQL,仅保留前面两条。
基本上,这就像是提供了一个切割的能力:一个普通的事务能够被切分为多个更“轻量”的事务,然后能进行部分回滚或部分提交。
但一定要注意,小心整个事务被无端回滚掉(例如由于抛出了IntegrityError异常但却没有捕抓,那所有的保存点都会因此被回滚掉的)
来看个示例代码,了解怎么玩转保存点。
@transaction.atomic()def save_points(self,save=True): user = User.create(‘jj‘,‘inception‘,‘jj‘,‘1234‘) sp1 = transaction.savepoint() user.name = ‘zheli hui guadiao, T.T‘ user.stripe_id = 4 user.save() if save: transaction.savepoint_commit(sp1) else: transaction.savepoint_rollback(sp1)
示例中,整个函数都是属于一个事务的。新User对象创建后,我们创建并得到了一个保存点。然后后续3行语句――
user.name = ‘zheli hui guadiao, T.T‘ user.stripe_id = 4 user.save()
――不属于刚才的保存点,因此他们有可能是属于下面的savepoint_rollback或savepoint_commit的一部分。假设是savepoint_rollback, 那代码行user = User.create(‘jj‘,‘inception‘,‘jj‘,‘1234‘)仍旧会成功提交到数据库中 ,而下面三行则不会成功。
采用另外一种方法,下面的两种测试用例描述了保存点是如何工作的:
def test_savepoint_rollbacks(self): self.save_points(False) #verify that everything was stored users = User.objects.filter(email=“inception”) self.assertEquals(len(users), 1) #note the values here are from the original create call self.assertEquals(users[0].stripe_id, ‘‘) self.assertEquals(users[0].name, ‘jj‘) def test_savepoint_commit(self): self.save_points(True) #verify that everything was stored users = User.objects.filter(email=“inception”) self.assertEquals(len(users), 1) #note the values here are from the update calls self.assertEquals(users[0].stripe_id, ‘4‘) self.assertEquals(users[0].name, ‘starting down the rabbit hole‘)
同样,在我们提交或者回滚保存点之后,我们仍然可以继续在同一个事务中工作。同时,这个运行结果不受之前保存点输出结果的影响。
例如,如果我们按照如下例子更新“save_points”函数,
@transaction.atomic()def save_points(self,save=True): user = User.create(‘jj‘,‘inception‘,‘jj‘,‘1234‘) sp1 = transaction.savepoint() user.name = ‘starting down the rabbit hole‘ user.save() user.stripe_id = 4 user.save() if save: transaction.savepoint_commit(sp1) else: transaction.savepoint_rollback(sp1) user.create(‘limbo‘,‘illbehere@forever‘,‘mind blown‘,‘1111‘)
即使无论是“savepoint_commit”或者“savepoint_rollback”被“limbo”这个用户调用了,这个事务仍然会被成功创建。如果没有创建成功,整个事务将会被回滚。
嵌套事务
采用“savepoint()”,“savepoint_commit”和“savepoint_rollback”去手动指定保存点,将会自动一个嵌套事务,同时这个嵌套事务会自动为我们创建一个保存点。并且,如果我们遇到错误,这个事务将会回滚。
下面用一个扩展的例子来说明:
@transaction.atomic()def save_points(self,save=True): user = User.create(‘jj‘,‘inception‘,‘jj‘,‘1234‘) sp1 = transaction.savepoint() user.name = ‘starting down the rabbit hole‘ user.save() user.stripe_id = 4 user.save() if save: transaction.savepoint_commit(sp1) else: transaction.savepoint_rollback(sp1) try: with transaction.atomic():user.create(‘limbo‘,‘illbehere@forever‘,‘mind blown‘, ‘1111‘)if not save: raise DatabaseError except DatabaseError: pass
这里我们可以看到:在我们处理保存点之后,我们采用“thetransaction.atomic”的上下文管理区擦出我们创建的“limbo”这个用户。当上下文管理被调用的时候,它会创建一个保存点(因为我们已经在事务里面了),同时这个保存点将会依据已经存在的上下文管理器去被执行或者回滚。
这样下面两个测试用例就描述了这个行文:
def test_savepoint_rollbacks(self):self.save_points(False) #verify that everything was stored users = User.objects.filter(email=“inception”) self.assertEquals(len(users), 1) #savepoint was rolled back so we should have original values self.assertEquals(users[0].stripe_id, ‘‘) self.assertEquals(users[0].name, ‘jj‘) #this save point was rolled back because of DatabaseError limbo = User.objects.filter(email=“illbehere@forever”) self.assertEquals(len(limbo),0) def test_savepoint_commit(self): self.save_points(True) #verify that everything was stored users = User.objects.filter(email=“inception”) self.assertEquals(len(users), 1) #savepoint was committed self.assertEquals(users[0].stripe_id, ‘4‘) self.assertEquals(users[0].name, ‘starting down the rabbit hole‘) #save point was committed by exiting the context_manager without an exception limbo = User.objects.filter(email=“illbehere@forever”) self.assertEquals(len(limbo),1)
因此,在现实之中你可以使用原子或者在事务之中创建保存点的保存点。使用原子,你不必要很仔细地担心提交和会滚,当这种情况发生时,你可以完全控制其中的保存点。
结论
如果你有任何以往使用Django更早版本事务处理的经验,你可以看到很多更简单地事务处理模型。如下,在默认情况下,也有自动提交功能,它是一个很好的例子,即Django与python两者都引以为豪所提供的“理智的”默认值。对于如此多的系统,你将不需要直接地来处理事务。只是让“自动提交功能”来完成其工作,但如果你这样做,我将希望这个帖子能提供你所需要像专家一样在Django之中管理的事务处理。
篇2:我国水污染物排放权有偿使用和交易政策框架
我国水污染物排放权有偿使用和交易政策框架
水污染物排放权有偿使用和交易政策是以环境经济学原理为基础,以市场为手段进行污染物总量控制的有效管理方式.有偿使用通过构建合理的价格形成机制,在无偿指标分配基础上利用市场手段优化区域流域水污染物总量指标配置,能在排污收费政策的'基础上增加治污资金筹集渠道;交易则能在一定程度上提高点源污染治理效率,有效弥补命令控制型管理政策的不足,创新污染防治模式.
作 者:李云生 吴悦颖 叶维丽 顾培 作者单位: 刊 名:环境经济 英文刊名:ENVIRONMENTAL ECONOMY 年,卷(期): “”(4) 分类号: 关键词:篇3:Project教程:使用Project管理项目
使用Project管理项目
世界上最好的管理工具也不能替代您自己的准确判断,但是,工具可以也应该有助于您完成下列工作。
跟踪您收集的与工作有关的所有信息:项目的工期、成本和资源需求。
以标准、美观的格式形象具体地呈现项目计划。
一致而高效地安排任务和资源。
与其他Microsoft Office 系统应用程序交换项目信息;
作为项目经理的您在保持对项目的最终控制权的同时,又能与资源和其他项目干系人交流。
使用外观和操作类似桌面程序的应用来管理项目。
Microsoft Office Project 2007系列包括的产品众多,具体有以下几种。
nMicrosoft Office Project Standard 2007用于项目管理的基于 Windows的桌面应用程序。此版本为单一项目管理人员设计,并且不能与Project Server交互。
nMicrosoft Office Project Professional 2007基于 Windows的桌面应用程序,包括Standard版的完整特性集,还有使用Project Server时需要的项目团队计划和通信功能。Project Professional加上Project Server是Microsoft的企业项目管理( Enterprise Project Management,EPM)产品的代表。
nMicrosoft Office Project Server 2007基于内联网的解决方案,
结合Project Professional使用时支持企业级的项目合作、时间表报表和状态报表。
nMicrosoft Office Project Web Access 2007使用Project Server时所用的基于Internet Explorer的界面。
nMicrosoft Office Project Portfolio Server 2007组合(Portfolio)管理解决方案。
提示 如需了解Project 2007的新特性以及Standard版本和Professional版本之间的区别,请查询微软的Office Online网站中的Project区域:先进入网站www.office.microsoft.com,然后浏览至Project页。基于企业项目管理的Project Server的产品组成列表参见本书20.1节。
本书的大部分章节着重讲述Project Standard版本的特性集,Project Standard版本是入门级的桌面项目管理工具。第Ⅳ部分介绍Project Professional版本和Project Server中可用的EPM特性。本书介绍的Project Standard版本的所有内容同样适用于Project Professional版本,所以学习本书第Ⅰ部分至第Ⅲ部分时可选用任一版本(本书的大部分截图均使用Project Professional版本完成——译者注)。如果您有Project Professional并可访问Project Server,就可仔细研读第Ⅳ部分介绍的特性。否则,可以粗略浏览第Ⅴ部分内容以确定您或您的公司是否应使用Project Professional版本和Project Server。
日程安排引擎的功能
大部分项目并没有使用真正的日程安排工具(如Project)来管理,但它们应该使用。工作中常见到的有:用电子表格程序(如Microsoft Office Excel)做出的任务和资源列表,或用绘图程序(如Visio)做出的格式优美的甘特图。Project优于以上程序的一大特点就是它包括日程安排引擎——它是计算核心,可以处理诸如连锁反应之类的问题。例如,当由100个任务组成的工作序列中的任务1的工期发生改变,日程安排引擎便会做出相应调整。计算任务的开始和结束日期时,日程安排引擎还可以考虑非工作时间(如周末)。诸如Excel和Visio之类的应用程序在项目管理工具箱中占有一席之地,但您需要日程安排引擎(如Project)来获得真正的成功。
更多内容进入:
精品学习网IT教育频道
篇4:Windows自动化管理的实现服务器教程
window
利用WMI软件开发包(SDK)可以方便地查看可用的CIM和Win32类,WMI SDK可以从msdn.microsoft.com/downloads/default.asp?URL=/code/sample.asp?url=/msdn-files/027/001/566/msdncompositedoc.xml下载,有8M多,可谓不小。
WMI SDK要求操作系统必须是Windows 2K/XP或者NT 4.0 SP4或更高版本;尽管Win9x系统上可以安装WMI支持软件,但SDK不能在Win9x上运行。另外,为支持SDK的ActiveX控件,SDK还要求有IE 5.0或更高版本。SDK对机器性能的最低要求是:Pentium处理器,32 Mb的RAM,40 Mb的磁盘空间,以及至少要有800 x 600、256色的显示设备。对于运行Windows 2K/XP的机器来说,这些要求应该不会成为问题。CIMOM默认以服务的形式运行,但如果机器没有网卡,CIMOM不能作为服务运行,不过此时可以作为一个应用运行,只需执行winmgmt.exe即可。winmgmt.exe在%systemroot%system32wbem的WMI主目录下。
SDK必须由管理员组的成员安装。安装过程很简单,执行WMISdk.exe启动向导,指定安装的目标目录(默认是program fileswmi)。选择要安装的可选组件(默认安装除了SNMP支持以外的所有组件),最后点击Finish。安装SDK不需要重新启动。安装完成后,“开始/程序”菜单上会增加一个WMI SDK组。
点击WMI SDK程序组的WMI CIM Studio。CIM Studio提示连接名称空间,并显示默认连接的名称空间是rootcimv2,确认即可。如果你用Administrator身分登录Windows,再次点击确定以当前身份登录;如果你用其他的身份登录Windows,请改用Administrator登录,
现在,假设我们要在当前的机器上查找一个对象:C:驱动器。我们不知道C:驱动器在CIM或WMI中的具体名称,浏览CIM Studio列出的数百个类又太麻烦,怎么办呢?可以使用Find按钮(左边上方的望远镜,参见图三)。图二显示了点击Find按钮后显示的Search for Class对话框,在这里输入我们猜想C:驱动器的类名称中应当包含的单词,然后点击Go!按钮。由于我们正在寻找一个命名的磁盘分区,而且我们知道Windows把这种分区叫做logical disk或logical drive,因此这里的搜索关键词可以是logical。当然,搜索关键词也可以是disk,但这时会有大量的搜索结果出现。
图二
图二显示了搜索关键词logical得到的结果。选择Win32_LogicalDisk并点击OK,图三的窗口出现(为什么不选择CIM_LogicalDisk?前面已经提到,WMI管理的所有对象都带有Win32前缀。如果选择CIM_LogicalDisk然后要求显示出它的实例,不可能看到可用逻辑驱动器的任何具体信息,只能看到对应每一个可用逻辑驱动器的Win32_LogicalDisk条目)。现在,窗口的右边显示出Win32_logicalDisk类的属性。可以看到,属性的值都为空,这是因为我们正在查看的是一个类,而不是类的具体实例。要显示出Win32_LogicalDisk类的实例,点击右边上面的Instances按钮(右数第四)。
图三
点击Instances按钮之后,窗口显示出当前机器上所有逻辑驱动器的实例,包括网络逻辑驱动器。点击设备ID为“C:”的实例,显示出图四的结果。右边窗格包含了当前实例的属性和方法,当前逻辑驱动器的名称显示在右边窗格的上方。
图四
利用脚本可以修改这些属性或调用这些方法。如果对某个属性的含义不太清楚,只需选择Win32_LogialDisk类或Win32_LogicalDisk.DeviceID=“C:”实例,再点击Help按钮。大多数对象的属性和方法都有详细的说明。
篇5:高级财务管理学的理论框架-―管理过程的财务实现
高级财务管理学的理论框架-―管理过程的财务实现
一、问题的提出
“财务管理是企业管理的中心”已经成为架构企业管理体系的基本理念。“财务管理”已经被国家教育部单独列为新的专业目录,开设“财务管理”专业是近年来各高等财经院校包括综合性大学里学科专业调整的“时尚”。然而,财务理论的发展与创新似乎与这种现实要求极不相称。翻开现有的财务教材,不难发现这些教材主要阐述财务管理基本理论与方法,或者以公司制企业尤其是上市公司为分析对象,重点以融资、投资和股利分配为内容来介绍企业财务管理的一般性问题,这些应该属于财务原理或“中级”财务管理的范畴。我们也同时感到这个层面上的内容相对比较成熟,已有一定的.系统性和完整性。然而,在理论上,财务管理理论体系如何向更高级的层次上发展;在学科建设方面,财务管理专业的课程体系也不能总是停留在“中级”财务管理学,必须进一步完善;在实践上,仅仅以融资、投资和股利分配为内容的财务管理结构与方法的局限性是明显的,切实致力于企业内部管理效率的提高和竞争能力的增强是非常必要的。这些需求就产生了所谓的“高级财务管理”的理论问题。
二、对高级财务管理的界定
(一)目前理论界的观点。要构建高级财务管理理论框架,首先面临的一个问题就是对高级财务管理学本身的界定问题,即何为高级财务管理,它与现行的一般或“中级”财务管理理论有何区别?所谓“高级”应如何体现呢?对于这一基本问题,现有文献(包括专门讨论高级财务管理的书籍[1])基本没有涉及。目前国内出版的各种《高级会计》教材大都认为高级会计是对原有财务会计内容进行横向补充、纵向延伸的一种以新出现的特殊业务为主的会计。与此不同的则是科普兰在其《高级管理会计》中所隐含的“高级”的内容。他是将管理会计放在了企业的集权、分权体制中,委托代理契约中进行与企业组织环境、管理过程相融合的研究。这里的“高级”不再是内容上的增补,而是实现管理会计管理机能的飞跃[2]。不过,现在无论是高级会计,还是高级管理会计,似乎都是一些“特殊业务”或者“专门问题”的罗列,缺乏将这些内容连接起来的一条主线,整体性与连贯性不理想,这可以说是理论研究与学科建设上的遗憾。
(二)我们的观点。
[1] [2] [3] [4]
篇6:Python的Bottle框架中实现最基本的get和post的方法的教程
作者:JohnnyHu90 字体:[增加 减小] 类型:
这篇文章主要介绍了Python的Bottle框架中实现最基本的get和post的方法的教程,Bottle框架在Python开发者中的人气很高,需要的朋友可以参考下
1、GET方式:
# -*- coding: utf-8 -*-#!/usr/bin/python# filename: GETPOST_test.py# codedtime: -9-20 19:07:04import bottledef check_login(username, password): if username == ‘123‘ and password == ‘234‘: return True else: return False@bottle.route(‘/login‘)def login: if bottle.request.GET.get(‘do_submit‘,‘‘).strip(): #点击登录按钮 # 第一种方式(latin1编码)## username = bottle.request.GET.get(‘username‘,‘‘).strip() # 用户名## password = bottle.request.GET.get(‘password‘,‘‘).strip() # 密码 #第二种方式(获取usernamepassword)(latin1编码) getValue = bottle.request.query_string## username = bottle.request.query[‘username‘] # An utf8 string provisionally decoded as ISO-8859-1 by the server## password = bottle.request.query[‘password‘] # 注:ISO-8859-1(即aka latin1编码) #第三种方式(获取UTF-8编码) username = bottle.request.query.username # The same string correctly re-encoded as utf8 by bottle password = bottle.request.query.password # The same string correctly re-encoded as utf8 by bottle print(‘getValue= ‘+getValue, ‘rnusername= ‘+username, ‘rnpassword= ‘+password) # test if check_login(username, password):return “
Your login information was correct.
” else:return “Login failed.
” else: return ‘‘‘ ‘‘‘bottle.run(host=‘localhost‘, port=8083)这里注意说一下Bottle编码的问题,只有第三种方式会将我们输入的字符如果是UTF-8重新编码为UTF-8,当你的内容里有中文或其他非英文字符时,这种方式就显的尤为重要,
Python的Bottle框架中实现最基本的get和post的方法的教程
,
运行效果如下:
2、POST方式:
# -*- coding: utf-8 -*-#!/usr/bin/python# filename: GETPOST_test.py# codedtime: 2014-9-20 19:07:04import bottledef check_login(username, password): if username == ‘123‘ and password == ‘234‘: return True else: return False@bottle.route(‘/login‘)def login(): return ‘‘‘ ‘‘‘@bottle.route(‘/login‘, method=‘POST‘)def do_login(): # 第一种方式# username = request.forms.get(‘username‘)# password = request.forms.get(‘password‘) #第二种方式 postValue = bottle.request.POST.decode(‘utf-8‘) username = bottle.request.POST.get(‘username‘) password = bottle.request.POST.get(‘password‘) if check_login(username, password): return “
Your login information was correct.
” else: return “Login failed.
”bottle.run(host=‘localhost‘, port=8083)登录网站、提交文章、评论等我们一般都会用POST方式而非GET方式,那么类似于第二种方式的编码就很用用处,能够正确的处理我们在Form中提交的内容。而第一种则可能会出现传说中的乱码问题,谨记!!!
篇7:Win7系统使用JS脚本实现关机功能的方法教程
1、按“Win+R”打开“运行”窗口,输入“notepad”命令后按回车,打开记事本;
2、在打开的记事本文档中键入下面的命令(new ActiveXObject(“Shell.Application”)).ShutdownWindows(),
3、点击“文件”——“另存为”,文件保存类型为系统默认,文件名改为JS后缀,比如关机.js,将路径保存到桌面上。 4、在桌面上看到有一个关机的图标,在该图标用鼠标右键,选择“创建快捷方式”。在桌面上查看到另一个快捷方式的“关机”;5、在其创建的快捷方式图标上,在该图标右键选择“属性”,然后在弹出来的属性窗口中,切换到快捷方式标签页中,在快捷键处输入你的快捷方式。
此时键盘上输入刚键入的快捷方式即可打开关机界面。
文档为doc格式