<span style="font-family: Arial, Verdana, sans-serifwhite-space: normalbackground-color: rgb(255, 255, 255)">首先,这个东东貌似只有windows上才能实现,所以,需要部署windows下的相关环境</span>
1、需要安装python
2、安装python的win32com的lib,下载地址:
http://sourceforge.net/projects/pywin32/files/
3、安装本地的web容器,我用的apache的tomcat
4、编写例子:
[html] view plaincopy
import uuid
import win32com.server.register
class PythonUtilities:
_public_methods_ = ['SplitString']
_reg_progid_ = "Python.Utilities"
#_reg_clsid_ = "{A6688635-62F5-41cb-AF54-CBA84C2F0F86}"
_reg_clsid = "{"+uuid.uuid1()+"}"
def SplitString(self, val):
return "Hello world ", val
if __name__ == '__main__':
print "Registering COM server..."
win32com.server.register.UseCommandLine(PythonUtilities)
将这个文件保存到tomcat的webapps下的一个目录中
5、编写测试的html页面
[html] view plaincopy
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/htmlcharset=UTF-8"/>
<SCRIPT LANGUAGE="JavaScript">
window.onload = function(){
var obj = new ActiveXObject("Python.Utilities")
alert(obj.SplitString("Hello world"))
}
</SCRIPT>
</head>
<body>
</body>
</html>
放到python文件的同一个目录
6、到命令行执行该python 代码
7、再请求该网页
一、django静态文件配置原理静态文件配置就是为了让用户请求时django服务器能找到静态文件返回。
首先要理解几个概念:
媒体文件:用户上传的文件
静态文件:css,js,image等
开发环境:使用django内置服务器处理静态文件
生产环境:使用apache2/nginx服务器处理静态文件映射
所以在配置时要分清楚开发环境还是生产环境,这个后面会详细介绍。
下面先介绍一下服务器查找静态文件的原理,这样我们才能更好的配置。
1、django.contrib.staticfiles
django.contrib.staticfiles是django1.3新增的一个app来帮助开发者管理静态文件【js,css等】。
django1.3之前的静态文件都是用MEDIA_URL和MEDIA_ROOT来控制的。
为了将媒体文件【用户上传的文件】和静态文件做区分,django1.3通过MEDIA_XXX配置来处理媒体文件,通过STATIC_XXX配置项来处理静态文件。
staticfiles使开发者可以将静态文件分配到app目录或任意指定目录。
2、MEDIA_XXX和STATIC_XXX配置项的区别
MEDIA_XXX配置项用来管理媒体文件。经常由FileFields字段上传,它们被保存在settings.MEDIA_ROOT指定的目录下,通过settings.MEDIA_URL指定的路径访问。
STATIC_XXX配置项用来管理静态文件。它们通过manage.py collectstatic命令汇集到settings.STATIC_ROOT目录,并通过settings.STATIC_URL指定的路径访问。
3、 静态文件相关配置项详解
STATIC_ROOT配置项
用来指定执行manage.py collectstatic时静态文件存放的路径。在生成环境中,集中存放静态资源有利于使用Lighttpd/Nginx/apache2托管静态资源。为了方便调试,通常设置如下:
复制代码代码如下:
SITE_ROOT = os.path.dirname(os.path.abspath(__file__))
SITE_ROOT = os.path.abspath(os.path.join(SITE_ROOT, '../'))
STATIC_ROOT = os.path.join(SITE_ROOT, 'collectedstatic')
STATIC_URL配置项
django模板中,可以引用{{STATIC_URL}}变量避免把路径写死。通常使用默认设置
复制代码代码如下:
STATIC_URL = '/static/'
ADMIN_MEDIA_PREFIX配置项
ADMIN_MEDIA_PREFIX必须为如下配置,以便staticfiles能够正确找到django.contrib.admin的静态资源:
复制代码代码如下:
ADMIN_MEDIA_PREFIX = STATIC_URL + 'admin/'
在模板中使用STATIC_URL
复制代码代码如下:
<link rel="stylesheet" href="{{ STATIC_URL }}css/core.css">
原理懂了后,接下来介绍开发环境和生产环境中静态文件具体配置。
我的django版本是1.4.21,以此版本做介绍。
复制代码代码如下:
>>>import django
>>>print django.get_version()
1.4.21
二、开发环境
django1.4,21中默认已安装了staticfiles app,所以开发环境中对静态文件的访问不需要对django做任何配置。
有一点:开发环境staticfiles查找静态文件的顺序取决于STATIC_FINDERS配置项,默认配置
复制代码代码如下:
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
#'django.contrib.staticfiles.finders.DefaultStorageFinder',
)
FileStstemFinder用来用STATICFILES_DIRS【默认为空】指定的路径中查找额外的静态文件。像jquery,bootstrap等这样公用的资源文件都是在多个不同的app中共用的,django提供了公有的目录来放这些文件,这个配置参数就是:STATICFILES_DIRS
AppDirectoriesFinder从INSTALLED_APPS元组中的APP所在包的static目录中查找资源文件。
使用如下。
1、新建项目lxyproject
复制代码代码如下:
[root@yl-web srv]# django-admin.py startproject lxyproject
2、在项目中新建一个app名叫hello
复制代码代码如下:
[root@yl-web lxyproject]# python manage.py startapp hello
[root@yl-web lxyproject]# ls
hello lxyproject manage.py
在hello app下建一个static目录用来存放静态文件。
复制代码代码如下:
[root@yl-web hello]# mkdir static
[root@yl-web hello]# ls
__init__.py models.py static tests.py views.py
然后在static目录新建一个hello.txt的静态文件。
复制代码代码如下:
[root@yl-web hello]# cd static/
[root@yl-web static]# ls
hello.txt
[root@yl-web static]# cat hello.txt
hello.txt's content:congratulations!!
3、在项目的settings.py文件中INSTALLED_APPS中配置hello app
复制代码代码如下:
INSTALLED_APPS = (
...
'hello',
)
4、运行项目
复制代码代码如下:
[root@yl-web lxyproject]# python manage.py runserver 0.0.0.0:9000
5、通过url访问
在static目录下新建一个images目录放一张sheep.png图片,同理通过url访问
import tkinter
win=tkinter.Tk()
win.title('第一个窗口')
win.geometry()
'''
Listbox 列表框控件:可以包含一个或者多个文本框
作业:在listbox控件的小窗口显示一个字符串
'''
#一:【支持鼠标移动选中位置】使用selectmode=tkinter.BROWSE,创建一个listbox,添加几个元素
'''
lb=tkinter.Listbox(win,selectmode=tkinter.BROWSE)
lb.pack()
for item in ['good','nice','beautiful']:
#1:添加
#按顺序添加(向后添加)
lb.insert(tkinter.END,item)
#在开始添加(往前添加)
lb.insert(tkinter.ACTIVE,'cool')
#将列表当成一个元素添加
#lb.insert(tkinter.END,['cool','sunk'])
'''
#2:删除【索引从0开始数】(删除开始索引到结束索引的所有元素),参数1为开始索引,参数2为结束索引,如果不指定参数2,只删除第一个索引的内容
#lb.delete(1)
#3:选中【索引从0开始数】(选中开始索引到结束索引的所有元素),参数1为开始索引,参数2为结束索引,如果不指定参数2,只选中第一个索引的内容
#lb.select_set(2)
#lb.select_set(2,4)
#4:取消选中【索引从0开始数】(取消选中开始索引到结束索引的所有元素),参数1为开始索引,参数2为结束索引,如果不指定参数2,只取消选中第一个索引的内容
#lb.select_clear(2)
#5:获取到列表中的元素个数
#print(lb.size())
#6:从列表中取值【索引从0开始数】(获取选中开始索引到结束索引的所有元素的值(tuple)),参数1为开始索引,参数2为结束索引,如果不指定参数2,只获取第一个索引的内容
#print(lb.get(1,2))
#7:返回当前选中的索引项(得到索引),不是的到内容
#print(lb.curselection())
#8:判断 一个选项是否被选中,返回布尔类型 用索引表示
#print(lb.select_includes(1))
#9:绑定变量
#lbv=tkinter.StringVar()
# 9.1 打印当前列表中的所有选项(tuple)
#print(lbv.get())
# 9.2 设置选项(tuple)
#lbv.set(('1','2'))
#10:绑定事件(需要一个参数,但是不要传)
'''
def myPrint(event):
print(lb.get(lb.curselection()))
lb.bind('<Double-Button-1>',myPrint)
#11:滚动条
sc=tkinter.Scrollbar(win)
sc.pack(side=tkinter.RIGHT,fill=tkinter.Y)
lb.pack(side=tkinter.LEFT,fill=tkinter.BOTH)
#关联
lb.configure(yscrollcommand=sc.set) (config方法也可以)
sc['command']=lb.yview #额外给属性赋值,相当于 sc.configure(command=text.yview)
'''
'''#二:【不支持鼠标移动选中位置,支持鼠标按下后选中位置】使用selectmode=tkinter.SINGLE,创建一个listbox,添加几个元素,与(一)相似
lb=tkinter.Listbox(win,selectmode=tkinter.SINGLE,listvariable=lbv)
lb.pack()
for item in ['good','nice','beautiful']:
lb.insert(tkinter.END,item)
'''
#三:【在一的功能上,可以使listbox支持shift和control(实现连选与多选)】使用selectmode=tkinter.EXTENDED
'''
lb=tkinter.Listbox(win,selectmode=tkinter.EXTENDED)
for item in ['good','nice','beautiful','good1','nice1','beautiful1','good2','nice2','beautiful2','good3','nice3','beautiful3']:
lb.insert(tkinter.END,item)
sc=tkinter.Scrollbar(win)
sc.pack(side=tkinter.RIGHT,fill=tkinter.Y)
lb.configure(yscrollcommand=sc.set)
lb.pack(side=tkinter.LEFT,fill=tkinter.BOTH)
sc['command']=lb.yview
'''
#四:【在二的功能上,支持多选】使用selectmode=tkinter.MULTIPLE
lb=tkinter.Listbox(win,selectmode=tkinter.MULTIPLE)
for item in ['good','nice','beautiful','good1','nice1','beautiful1','good2','nice2','beautiful2','good3','nice3','beautiful3']:
lb.insert(tkinter.END,item)
lb.pack()
win.mainloop()