From 1d62f92f96559d837fb891f76d45b3c160635211 Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 12 Oct 2020 22:35:06 +0800 Subject: [PATCH 01/18] kun --- common/autoload.py | 2 +- config/__init__.py | 2 +- setup.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/common/autoload.py b/common/autoload.py index 974efdf..bea86f4 100644 --- a/common/autoload.py +++ b/common/autoload.py @@ -936,7 +936,7 @@ class create: if chunk: f.write(chunk) f.close() - if zipfile.is_zipfile(self.appname+"/"+self.modular+"/controller/"+plug+".zip"): + if zipfile.is_zipfile(self.appname+"/"+self.modular+"/controller/"+plug+".zip") and os.path.isfile(self.appname+"/"+self.modular+"/controller/"+plug+".zip"): break else: tttttt+=1 diff --git a/config/__init__.py b/config/__init__.py index 830b363..dfb4d20 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -100,7 +100,7 @@ email['recNick']='' #默认收件人昵称 kcweb={} kcweb['name']='kcweb' #项目的名称 -kcweb['version']='4.12.2' #项目版本 +kcweb['version']='4.12.3' #项目版本 kcweb['description']='' #项目的简单描述 kcweb['long_description']='' #项目详细描述 kcweb['license']='MIT' #开源协议 mit开源 diff --git a/setup.py b/setup.py index 1d4a1c2..db8bfac 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,7 @@ def file_get_content(k): return con confkcw={} confkcw['name']='kcweb' #项目的名称 -confkcw['version']='4.12.2' #项目版本 +confkcw['version']='4.12.3' #项目版本 confkcw['description']='' #项目的简单描述 confkcw['long_description']="增加websocket" #项目详细描述 confkcw['license']='MIT License' #开源协议 mit开源 -- Gitee From 3ba86af38b9d6ac2387e8f9e0f4da7fa600d5207 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 17 Oct 2020 13:34:50 +0800 Subject: [PATCH 02/18] kun --- common/autoload.py | 133 +++++++++++++++++++++++++++++++-------------- 1 file changed, 92 insertions(+), 41 deletions(-) diff --git a/common/autoload.py b/common/autoload.py index bea86f4..a9136e8 100644 --- a/common/autoload.py +++ b/common/autoload.py @@ -892,6 +892,9 @@ class create: elif arr['code']==0: os.remove(self.appname+"/"+self.modular+"/controller/"+plug+".zip") return True,arr['msg'] + elif arr['code']==0: + os.remove(self.appname+"/"+self.modular+"/controller/"+plug+".zip") + return False,arr['msg'] else: os.remove(self.appname+"/"+self.modular+"/controller/"+plug+".zip") return False,arr['msg'] @@ -936,6 +939,7 @@ class create: if chunk: f.write(chunk) f.close() + time.sleep(0.3) if zipfile.is_zipfile(self.appname+"/"+self.modular+"/controller/"+plug+".zip") and os.path.isfile(self.appname+"/"+self.modular+"/controller/"+plug+".zip"): break else: @@ -970,21 +974,22 @@ class create: if config.app['app_debug']: print("建议更新您的pip版本。参考命令:Python -m pip install --user --upgrade pip -i https://mirrors.aliyun.com/pypi/simple/") return False,str(e) - # try: - # m=importlib.import_module(self.appname+"."+self.modular+"/controller/"+plug+".install") - # except: - # shutil.rmtree(self.appname+"."+self.modular+"/controller/"+plug) - # print(traceback.format_exc()) - # return False,"插件依赖包文件不存在或依赖包文件格式错误" - # else: - # try: - # a=m.install() - # except: - # shutil.rmtree(self.appname+"."+self.modular+"/controller/"+plug) - # return False,"插件依赖包install函数被破坏" - # if not a[0]: - # shutil.rmtree(self.appname+"."+self.modular+"/controller/"+plug) - # return False,str(a[1]) + if os.path.isfile(self.appname+"."+self.modular+"/controller/"+plug+"/install.py"): + try: + m=importlib.import_module(self.appname+"."+self.modular+"/controller/"+plug+".install") + except: + shutil.rmtree(self.appname+"."+self.modular+"/controller/"+plug) + print(traceback.format_exc()) + return False,"插件依赖包文件不存在或依赖包文件格式错误" + else: + try: + a=m.install() + except: + shutil.rmtree(self.appname+"."+self.modular+"/controller/"+plug) + return False,"插件依赖包install函数被破坏" + if not a[0]: + shutil.rmtree(self.appname+"."+self.modular+"/controller/"+plug) + return False,str(a[1]) f=open(self.appname+"/"+self.modular+"/controller/__init__.py","r",encoding='utf-8') text=f.read() @@ -1004,6 +1009,7 @@ class create: f.write(text) f.close() + return True,"插件安装成功,"+plug+"=="+str(arr['edition']) else: return False,str(plug)+"插件下载失败" @@ -1123,11 +1129,31 @@ class create: "from "+self.appname+" import config\n"+ "G=globals.G") f.close() + + content='' + f=open(self.appname+"/"+self.modular+"/common/autoload.py","r",encoding='utf-8') + while True: + line = f.readline() + if not line: + break + elif 'from' not in line and 'import' not in line: + content+=line + f.close() f=open(self.appname+"/"+self.modular+"/common/autoload.py","w",encoding='utf-8') - f.write("from "+self.appname+".common import *") + f.write("from "+self.appname+".common import *\n"+content) + f.close() + + content='' + f=open(self.appname+"/"+self.modular+"/controller/index/common/autoload.py","r",encoding='utf-8') + while True: + line = f.readline() + if not line: + break + elif 'from' not in line and 'import' not in line: + content+=line f.close() f=open(self.appname+"/"+self.modular+"/controller/index/common/autoload.py","w",encoding='utf-8') - f.write("from "+self.appname+"."+self.modular+".common import *") + f.write("from "+self.appname+"."+self.modular+".common import *\n"+content) f.close() return True,"应用创建成功" else: @@ -1157,12 +1183,19 @@ class create: modular="api" elif arr['code']==0 and arr['data']: arr=arr['data'] - r=requests.get(arr['dowurl']) - f = open(self.appname+"/"+self.modular+".zip", "wb") - for chunk in r.iter_content(chunk_size=1024*100): - if chunk: - f.write(chunk) - f.close() + #循环下载模块 + i=0 + while i < 5: + r=requests.get(arr['dowurl']) + f = open(self.appname+"/"+self.modular+".zip", "wb") + for chunk in r.iter_content(chunk_size=1024*100): + if chunk: + f.write(chunk) + f.close() + time.sleep(0.3) + if os.path.isfile(self.appname+"/"+self.modular+".zip"): + break + i+=1 if os.path.isfile(self.appname+"/"+self.modular+".zip"):#安装打包好的模块 zip.unzip_file(self.appname+"/"+self.modular+".zip",self.appname+"/"+self.modular+"/") os.remove(self.appname+"/"+self.modular+".zip") @@ -1192,33 +1225,51 @@ class create: if config.app['app_debug']: print("建议更新您的pip版本。参考命令:Python -m pip install --user --upgrade pip -i https://mirrors.aliyun.com/pypi/simple/") return False,str(e) - # try: - # m=importlib.import_module(self.appname+'.'+self.modular+'.install') - # except: - # shutil.rmtree(self.appname+"/"+self.modular) - # print(traceback.format_exc()) - # return False,"模块依赖包文件不存在或依赖包文件格式错误" - # else: - # try: - # a=m.install() - # except: - # shutil.rmtree(self.appname+"/"+self.modular) - # return False,"模块依赖包install方法被破坏" - # if not a[0]: - # shutil.rmtree(self.appname+"/"+self.modular) - # return False,str(a[1]) + if os.path.isfile(self.appname+"/"+self.modular+"/install.py"):#如果存在依赖文件 + try: + m=importlib.import_module(self.appname+'.'+self.modular+'.install') + except: + shutil.rmtree(self.appname+"/"+self.modular) + print(traceback.format_exc()) + return False,"模块依赖包文件不存在或依赖包文件格式错误" + else: + try: + a=m.install() + except: + shutil.rmtree(self.appname+"/"+self.modular) + return False,"模块依赖包install方法被破坏" + if not a[0]: + shutil.rmtree(self.appname+"/"+self.modular) + return False,str(a[1]) content="\nfrom . import "+self.modular f=open(self.appname+"/__init__.py","a",encoding='utf-8') f.write(content) f.close() - + content='' + f=open(self.appname+"/"+self.modular+"/common/autoload.py","r",encoding='utf-8') + while True: + line = f.readline() + if not line: + break + elif 'from' not in line and 'import' not in line: + content+=line f.close() f=open(self.appname+"/"+self.modular+"/common/autoload.py","w",encoding='utf-8') - f.write("from "+self.appname+".common import *") + f.write("from "+self.appname+".common import *\n"+content) + f.close() + + content='' + f=open(self.appname+"/"+self.modular+"/controller/index/common/autoload.py","r",encoding='utf-8') + while True: + line = f.readline() + if not line: + break + elif 'from' not in line and 'import' not in line: + content+=line f.close() f=open(self.appname+"/"+self.modular+"/controller/index/common/autoload.py","w",encoding='utf-8') - f.write("from "+self.appname+"."+self.modular+".common import *") + f.write("from "+self.appname+"."+self.modular+".common import *\n"+content) f.close() else: return False,self.modular+"模块下载失败" -- Gitee From 2c0b85d26293bdcefd73f5b68973273be53cc190 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 24 Oct 2020 13:18:53 +0800 Subject: [PATCH 03/18] kun --- Events.py | 2 +- app.py | 2 +- common/autoload.py | 176 +++++++++++++++++++++++---------------------- utill/db/mysql.py | 9 +-- 4 files changed, 97 insertions(+), 92 deletions(-) diff --git a/Events.py b/Events.py index c52d4ef..1e6cd7e 100644 --- a/Events.py +++ b/Events.py @@ -14,7 +14,7 @@ class MyFileSystemEventHander(FileSystemEventHandler): if time.time()-eventgtimexz > 3: eventgtimexz=time.time() # print('* 更新文件:%s' % event.src_path) - # time.sleep(2) + time.sleep(2) time.sleep(0.2) self.restart() class Events: diff --git a/app.py b/app.py index ebf10f9..96a717e 100644 --- a/app.py +++ b/app.py @@ -563,7 +563,7 @@ class web: if self.__config.app['after_request']: #请求后执行的函数 try: - data=getattr(obj,self.__config.app['after_request'])() + data=getattr(obj,self.__config.app['after_request'])(body,status,resheader) if data: body,status,resheader=web.__tran(self,data,status,resheader) except (AttributeError,UnboundLocalError):pass diff --git a/common/autoload.py b/common/autoload.py index a9136e8..6a5bcb6 100644 --- a/common/autoload.py +++ b/common/autoload.py @@ -310,6 +310,12 @@ def Templates(path,**context): t=lookup.get_template(path) body=t.render(**context) return body +def getfunction(strs): + """获取指定文件对象 + + strs :app.index.common.autoload 获取app/index/common/目录下的autoload对象 + """ + return importlib.import_module(strs) def mysql(table=None,configss=None): """mysql数据库操作实例 @@ -909,6 +915,7 @@ class create: else: http=Http() i=0 + j=0 tplug=plug modular=self.modular while True: @@ -929,94 +936,91 @@ class create: modular="api" tplug="index" #默认插件 elif arr['code']==0 and arr['data']: + i=0 + j+=1 arr=arr['data'] - tttttt=0 - while True: - if tttttt<5: - r=requests.get(arr['dowurl']) - f = open(self.appname+"/"+self.modular+"/controller/"+plug+".zip", "wb") - for chunk in r.iter_content(chunk_size=512): - if chunk: - f.write(chunk) - f.close() - time.sleep(0.3) - if zipfile.is_zipfile(self.appname+"/"+self.modular+"/controller/"+plug+".zip") and os.path.isfile(self.appname+"/"+self.modular+"/controller/"+plug+".zip"): - break - else: - tttttt+=1 - else: - return False,plug+"插件下载失败" - if os.path.isfile(self.appname+"/"+self.modular+"/controller/"+plug+".zip"):#安装打包好的插件 - zip.unzip_file(self.appname+"/"+self.modular+"/controller/"+plug+".zip",self.appname+"/"+self.modular+"/controller/"+plug+"/") - os.remove(self.appname+"/"+self.modular+"/controller/"+plug+".zip") - if os.path.isfile(self.appname+"/"+self.modular+"/controller/"+plug+"/install.txt"): #安装依赖包 - install_requires=[] - try: - f=open(self.appname+"/"+self.modular+"/controller/"+plug+"/install.txt") - while True: - line = f.readline() - if not line: - break - elif len(line) > 2: - install_requires.append(line) - f.close() - except: - shutil.rmtree(self.appname+"."+self.modular+"/controller/"+plug) - return False,"error" - if len(install_requires): - try: - install_requires.insert(0,"install") - if 0 != pip.main(install_requires): - shutil.rmtree(self.appname+"/"+self.modular+"/controller/"+plug) - return False,"error" - except AttributeError as e: - shutil.rmtree(self.appname+"/"+self.modular+"/controller/"+plug) - if config.app['app_debug']: - print("建议更新您的pip版本。参考命令:Python -m pip install --user --upgrade pip -i https://mirrors.aliyun.com/pypi/simple/") - return False,str(e) - if os.path.isfile(self.appname+"."+self.modular+"/controller/"+plug+"/install.py"): - try: - m=importlib.import_module(self.appname+"."+self.modular+"/controller/"+plug+".install") - except: - shutil.rmtree(self.appname+"."+self.modular+"/controller/"+plug) - print(traceback.format_exc()) - return False,"插件依赖包文件不存在或依赖包文件格式错误" - else: - try: - a=m.install() - except: - shutil.rmtree(self.appname+"."+self.modular+"/controller/"+plug) - return False,"插件依赖包install函数被破坏" - if not a[0]: - shutil.rmtree(self.appname+"."+self.modular+"/controller/"+plug) - return False,str(a[1]) - - f=open(self.appname+"/"+self.modular+"/controller/__init__.py","r",encoding='utf-8') - text=f.read() - f.close() - text=re.sub("\nfrom . import "+plug,"",text) - text=re.sub("from . import "+plug,"",text) - f=open(self.appname+"/"+self.modular+"/controller/__init__.py","w",encoding='utf-8') - text+="\nfrom . import "+plug - f.write(text) - f.close() - - f=open(self.appname+"/"+self.modular+"/controller/"+plug+"/common/autoload.py","r",encoding='utf-8') - text=f.read() - f.close() - text=re.sub("app.api",self.appname+"."+self.modular,text) - f=open(self.appname+"/"+self.modular+"/controller/"+plug+"/common/autoload.py","w",encoding='utf-8') - f.write(text) - f.close() - - - return True,"插件安装成功,"+plug+"=="+str(arr['edition']) - else: + r=requests.get(arr['dowurl']) + f = open(self.appname+"/"+self.modular+"/controller/"+plug+".zip", "wb") + for chunk in r.iter_content(chunk_size=512): + if chunk: + f.write(chunk) + f.close() + if zipfile.is_zipfile(self.appname+"/"+self.modular+"/controller/"+plug+".zip") and os.path.isfile(self.appname+"/"+self.modular+"/controller/"+plug+".zip"): + break + if j >= 10: return False,str(plug)+"插件下载失败" + time.sleep(0.1) else: - return False,str(plug)+"插件下载失败" + return False,str(plug)+"插件搜索失败" else: return False,self.modular+"模块下找不到"+str(plug)+"插件" + if os.path.isfile(self.appname+"/"+self.modular+"/controller/"+plug+".zip"):#安装打包好的插件 + zip.unzip_file(self.appname+"/"+self.modular+"/controller/"+plug+".zip",self.appname+"/"+self.modular+"/controller/"+plug+"/") + os.remove(self.appname+"/"+self.modular+"/controller/"+plug+".zip") + if os.path.isfile(self.appname+"/"+self.modular+"/controller/"+plug+"/install.txt"): #安装依赖包 + install_requires=[] + try: + f=open(self.appname+"/"+self.modular+"/controller/"+plug+"/install.txt") + while True: + line = f.readline() + if not line: + break + elif len(line) > 2: + install_requires.append(line) + f.close() + except: + shutil.rmtree(self.appname+"."+self.modular+"/controller/"+plug) + return False,"error" + if len(install_requires): + try: + install_requires.insert(0,"install") + if 0 != pip.main(install_requires): + shutil.rmtree(self.appname+"/"+self.modular+"/controller/"+plug) + return False,"error" + except AttributeError as e: + shutil.rmtree(self.appname+"/"+self.modular+"/controller/"+plug) + if config.app['app_debug']: + print("建议更新您的pip版本。参考命令:Python -m pip install --user --upgrade pip -i https://mirrors.aliyun.com/pypi/simple/") + return False,str(e) + if os.path.isfile(self.appname+"."+self.modular+"/controller/"+plug+"/install.py"): + try: + m=importlib.import_module(self.appname+"."+self.modular+"/controller/"+plug+".install") + except: + shutil.rmtree(self.appname+"."+self.modular+"/controller/"+plug) + print(traceback.format_exc()) + return False,"插件依赖包文件不存在或依赖包文件格式错误" + else: + try: + a=m.install() + except: + shutil.rmtree(self.appname+"."+self.modular+"/controller/"+plug) + return False,"插件依赖包install函数被破坏" + # if not a[0]: + # shutil.rmtree(self.appname+"."+self.modular+"/controller/"+plug) + # return False,str(a[1]) + + f=open(self.appname+"/"+self.modular+"/controller/__init__.py","r",encoding='utf-8') + text=f.read() + f.close() + text=re.sub("\nfrom . import "+plug,"",text) + text=re.sub("from . import "+plug,"",text) + f=open(self.appname+"/"+self.modular+"/controller/__init__.py","w",encoding='utf-8') + text+="\nfrom . import "+plug + f.write(text) + f.close() + + f=open(self.appname+"/"+self.modular+"/controller/"+plug+"/common/autoload.py","r",encoding='utf-8') + text=f.read() + f.close() + text=re.sub("app.api",self.appname+"."+self.modular,text) + f=open(self.appname+"/"+self.modular+"/controller/"+plug+"/common/autoload.py","w",encoding='utf-8') + f.write(text) + f.close() + + + return True,"插件安装成功,"+plug+"=="+str(arr['edition']) + else: + return False,str(plug)+"插件获取失败" def uninstallmodular(self): "卸载模块" f=open(self.appname+"/__init__.py","r") @@ -1238,9 +1242,9 @@ class create: except: shutil.rmtree(self.appname+"/"+self.modular) return False,"模块依赖包install方法被破坏" - if not a[0]: - shutil.rmtree(self.appname+"/"+self.modular) - return False,str(a[1]) + # if not a[0]: + # shutil.rmtree(self.appname+"/"+self.modular) + # return False,str(a[1]) content="\nfrom . import "+self.modular f=open(self.appname+"/__init__.py","a",encoding='utf-8') f.write(content) diff --git a/utill/db/mysql.py b/utill/db/mysql.py index c2598e8..3dffb8d 100644 --- a/utill/db/mysql.py +++ b/utill/db/mysql.py @@ -2,7 +2,7 @@ from .pymysql import connect,escape_string # import config.conf as config import kcweb.config as config -import time,traceback,decimal,random #,copy +import time,traceback,decimal,random,copy dbconfig=config.database class mysql: """数据库实例""" @@ -20,7 +20,7 @@ class mysql: def __del__(self): pass def close(self): - "关闭连接,该方法无需理会,框架自动完成" + "关闭连接,web一下模式下该方法无需理会,框架自动完成" if not self.__config['pattern'] and mysql.__conn: if self.__connlists: for k in self.__connlists: @@ -38,7 +38,7 @@ class mysql: i=0 for thost in self.__config['host']: identifier=thost+str(self.__config['port'][i])+self.__config['user'][i]+self.__config['password'][i]+self.__config['db'][i] - print(mysql.__conn) + # print(mysql.__conn) for k in mysql.__conn[identifier]: try: k['obj'].close() @@ -55,6 +55,7 @@ class mysql: mysql.__conn={} if self.__config['debug']: print("mysql短连接已关闭",mysql.__conn) + mysql.__config=copy.deepcopy(dbconfig) __dbcount=1 def __setdbcount(self): "设置数据库配置总数量" @@ -947,7 +948,7 @@ class mysql: elif types=='sum': self.__sql="SELECT SUM(%s) FROM %s" % (self.__field,self.__table) elif types=='setinc': - self.__sql="update %s set %s=%s+%d" % (self.__table,data['field'],data['field'],data['key']) + self.__sql="update %s set %s=%s+%s" % (self.__table,data['field'],data['field'],data['key']) elif types=='update': strs='' for k in data: -- Gitee From 9077e5d3d2da3ddb79910aec1c56d0babab21d77 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 25 Oct 2020 10:21:58 +0800 Subject: [PATCH 04/18] kun --- common/autoload.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/common/autoload.py b/common/autoload.py index 6a5bcb6..1b59ace 100644 --- a/common/autoload.py +++ b/common/autoload.py @@ -587,6 +587,7 @@ class kcwtar: return False class response: + tpldata={} #公共模板变量 def tpl(path=None,status='200 ok',response_cache=False,ETag=None,header={"Content-Type":"text/html; charset=utf-8"},**context): """返回模板内容 @@ -600,6 +601,14 @@ class response: header 响应头 """ + for k in dir(response): + if k not in ['download','json','pic','redirect','tpl','tpldata','video'] and k[-2:]!='__': + try: + context[k]=response.__dict__[k] + except KeyError: + pass + context['config']=config + print(context) headers=copy.deepcopy(header) getroutecomponent=globals.VAR.component if path: @@ -629,16 +638,16 @@ class response: else: headers['response_cache']="default" set_cache(ETag,1) - body=Template(Temppath,config=config,**context) + body=Template(Temppath,**context) dateArray = core_datetime.datetime.utcfromtimestamp(times()-86400) otherStyleTime = dateArray.strftime('%a, %d %b %Y %H:%M:%S GMT') headers['Last-Modified']=otherStyleTime headers['ETag']=ETag return body,status,headers elif status: - return Template(Temppath,config=config,**context),status,headers + return Template(Temppath,tpldata=response.tpldata,**context),status,headers else: - return Template(Temppath,config=config,**context),'200 ok',headers + return Template(Temppath,tpldata=response.tpldata,**context),'200 ok',headers def json(res=[],status='200 ok',response_cache=False,ETag=None,header={"Content-Type":"application/json; charset=utf-8","Access-Control-Allow-Origin":"*"}): """响应json内容 -- Gitee From a2d35e6b117168ce5f4e4658d2193e10d822496a Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 25 Oct 2020 10:23:29 +0800 Subject: [PATCH 05/18] kun --- common/autoload.py | 1 - 1 file changed, 1 deletion(-) diff --git a/common/autoload.py b/common/autoload.py index 1b59ace..a015f40 100644 --- a/common/autoload.py +++ b/common/autoload.py @@ -608,7 +608,6 @@ class response: except KeyError: pass context['config']=config - print(context) headers=copy.deepcopy(header) getroutecomponent=globals.VAR.component if path: -- Gitee From 610b9bef067a04d1a183e49e969b4fa6a2108567 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 25 Oct 2020 15:10:12 +0800 Subject: [PATCH 06/18] kun --- README.md | 102 +++++++++++++++++++++--------------------------------- 1 file changed, 40 insertions(+), 62 deletions(-) diff --git a/README.md b/README.md index 7dee6dd..1940be6 100644 --- a/README.md +++ b/README.md @@ -1,66 +1,44 @@ -完整文档请参考:http://intapp.kwebapp.cn/index/index/doc/docde/1 -#### 创建应用 -- 新建一个server.py文件,内容如下,执行python3 server.py创建应用 -- 如下面的代码创建了一个app应用,同时在app应用下创建了一个api模块 -```server.py -from kcweb.create import create -create("app","api") # 创建项目 -``` -- 您的目录结构应该是这样,如下: -``` -├─./ 框架目录 -├─app 公共方法目录 -│ ├─common 公共函数目录 -│ │ ├─__init__.py 函数文件 -│ ├─config 配置目录 -│ │ ├─__init__.py 配置文件 -│ ├─api 模块目录 -│ │ ├─common 该模块的公共函数目录 -│ │ │ ├─__init__.py 函数文件 -│ │ ├─controller 控制器目录 -│ │ │ ├─__init__.py 版本初始化文件 -│ │ │ ├─v1 -│ │ │ │ ├─__init__.py 函数初始化文件 -│ │ │ │ ├─index.py 控制器文件 -│ │ │ ├─v2 -│ │ │ │ ├─__init__.py 函数初始化文件 -│ │ │ │ ├─index.py 控制器文件 -│ │ ├─tpl 模板文件目录 -│ │ │ ├─v1 -│ │ │ │ ├─index -│ │ │ │ │ ├─index.html 模块文件 -│ │ │ ├─v1 -│ │ │ │ ├─index -│ │ │ │ │ ├─index.html 模块文件 -│ │ ├─__init__.py 控制器初始化文件 -│ ├─static 静态资源目录 -│ ├─runtime 缓存目录 -│ ├─__init__.py 自动导入模块文件 -├─server.py 应用创建后生成的运行文件(应用创建时自动创建) -``` -- 其中server.py文件内容将被修改如下 -``` -# #gunicorn -b 0.0.0.0:39001 server:app -from kcweb import web -import app as application -app=web(__name__,application) -if __name__ == "__main__": - #app 是当前文件名 host监听ip port端口 name python解释器名字 (windows一般是python linux一般是python3) - app.run("server",host="0.0.0.0",port="39001",name="python") -``` -- 如果您当前系统的python解释器名字是python3,你应该是在当前目录下执行python3 server.py。 然后访问127.0.0.1:39001 +

kcweb==4.12.2框架简要说明

+kcweb作为web开发而设计的高性能框架,采用全新的架构思想,注重易用性。遵循MIT开源许可协议发布,意味着个人和企业可以免费使用kcweb,甚至允许把你基于kcweb开发的应用开源或商业产品发布或销售。 -- 如果您当前系统的python解释器名字是python,您应该修改server.py代码如下 -``` -# #gunicorn -b 0.0.0.0:39001 server:app -from kcweb import web -import app as application -app=web(__name__,application) -if __name__ == "__main__": - #app 是当前文件名 host监听ip port端口 - app.run("server",host="0.0.0.0",port="39001",name="python") -``` -然后访问127.0.0.1:39001 +[官方文档](https://intapp.kwebapp.cn/intapp/doc/index/finddoc/1/28/1 "官方文档") + + +------------ +


+-

状态

+> +已发布 + +---- +###迭代 与4.12.0文档差异 +-

修复

+> +请求/响应 +-- -- 请求信息 +mysql +-- -- 更新数据 +-- -- -- -- 字段增减 +控制器/* + +---- + +-

新增

+> +无 + + +-

废弃

+> +无 + +---- + +-

兼容性

+> +不兼容4.12.2之前的版本 + +----- -- Gitee From 4ba8c1cff31334f03e3e18478136a38dcb0eb6f8 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 25 Oct 2020 15:13:18 +0800 Subject: [PATCH 07/18] kun --- README.md | 23 ++--------------------- 1 file changed, 2 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 1940be6..5097beb 100644 --- a/README.md +++ b/README.md @@ -8,34 +8,15 @@ kcweb作为web开发而设计的高性能框架,采用全新的架构思想, ------------ +


+ -

状态

> 已发布 ----- -###迭代 与4.12.0文档差异 --

修复

-> -请求/响应 --- -- 请求信息 -mysql --- -- 更新数据 --- -- -- -- 字段增减 -控制器/* - ---- --

新增

-> -无 - - --

废弃

-> -无 - ----- -

兼容性

> -- Gitee From 842b28749262005b4c6ccdaf9619bcba0b0b0059 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 25 Oct 2020 15:13:46 +0800 Subject: [PATCH 08/18] kun --- README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/README.md b/README.md index 5097beb..9dacaf3 100644 --- a/README.md +++ b/README.md @@ -5,12 +5,8 @@ kcweb作为web开发而设计的高性能框架,采用全新的架构思想, [官方文档](https://intapp.kwebapp.cn/intapp/doc/index/finddoc/1/28/1 "官方文档") - - ------------ -


- -

状态

> 已发布 -- Gitee From 5ee4a968d57d87ac14ded41b58a61d781968c70d Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 25 Oct 2020 15:16:33 +0800 Subject: [PATCH 09/18] kun --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 9dacaf3..8a816f1 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,6 @@ kcweb作为web开发而设计的高性能框架,采用全新的架构思想, ---- - -

兼容性

> 不兼容4.12.2之前的版本 -- Gitee From 037c589060e87c1369ca071e4a9bc447a170dc9b Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 25 Oct 2020 15:17:46 +0800 Subject: [PATCH 10/18] kun --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8a816f1..5ecbf15 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -

kcweb==4.12.2框架简要说明

+

kcweb==4.12.3框架简要说明

kcweb作为web开发而设计的高性能框架,采用全新的架构思想,注重易用性。遵循MIT开源许可协议发布,意味着个人和企业可以免费使用kcweb,甚至允许把你基于kcweb开发的应用开源或商业产品发布或销售。 @@ -9,12 +9,12 @@ kcweb作为web开发而设计的高性能框架,采用全新的架构思想, -

状态

> -已发布 +开发版 ---- -

兼容性

> -不兼容4.12.2之前的版本 +向下兼容到4.12.2 ----- -- Gitee From abf1dbb97d34e55007510bc929b4756b3757a7c4 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 25 Oct 2020 15:18:21 +0800 Subject: [PATCH 11/18] kun --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5ecbf15..848c790 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ kcweb作为web开发而设计的高性能框架,采用全新的架构思想,注重易用性。遵循MIT开源许可协议发布,意味着个人和企业可以免费使用kcweb,甚至允许把你基于kcweb开发的应用开源或商业产品发布或销售。 -[官方文档](https://intapp.kwebapp.cn/intapp/doc/index/finddoc/1/28/1 "官方文档") +[官方文档](https://intapp.kwebapp.cn/intapp/doc/index/finddoc/1/29/1 "官方文档") ------------ -- Gitee From ae96fd9c48a38f42395804122f3f2e0564c04f1c Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 25 Oct 2020 15:18:42 +0800 Subject: [PATCH 12/18] kun --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 848c790..e3f3a9c 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ kcweb作为web开发而设计的高性能框架,采用全新的架构思想,注重易用性。遵循MIT开源许可协议发布,意味着个人和企业可以免费使用kcweb,甚至允许把你基于kcweb开发的应用开源或商业产品发布或销售。 -[官方文档](https://intapp.kwebapp.cn/intapp/doc/index/finddoc/1/29/1 "官方文档") +[官方完整文档](https://intapp.kwebapp.cn/intapp/doc/index/finddoc/1/29/1 "官方文档") ------------ -- Gitee From 2bd8bad8f5c88961df5d6649d870d5bc6e312cd9 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 25 Oct 2020 17:19:30 +0800 Subject: [PATCH 13/18] kun --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 6cebfc2..e57e69a 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020 坤坤 +Copyright (c) 2020 冯树坤 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal -- Gitee From 5238db3e9292565a381e551d4069c0401bc008ac Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 8 Nov 2020 22:40:50 +0800 Subject: [PATCH 14/18] kun --- app.py | 19 +++++++++++++++---- common/request.py | 11 +++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/app.py b/app.py index 96a717e..e44d3b9 100644 --- a/app.py +++ b/app.py @@ -69,11 +69,16 @@ class web: env['BODY_DATA']=str(env['wsgi.input'].next(), encoding = "utf-8") except: env['BODY_DATA']="" + try: + env['HTTP_X_REAL_IP']=env['HTTP_X_REAL_IP'] + except: + env['HTTP_X_REAL_IP']="" status,resheader,body=self.__routes(self,env) if type(body) is bytes: pass else: body=bytes(body, encoding='utf-8') + # print(env) start_response(status,resheader) return [body] return apps @@ -123,6 +128,7 @@ class web: 'HTTP_HOST':'', 'HTTP_COOKIE':'', 'REMOTE_ADDR':'', + 'HTTP_X_REAL_IP':'', 'HTTP_USER_AGENT':'', 'BODY_DATA':'' } @@ -365,6 +371,8 @@ class web: globals.HEADER.SERVER_PROTOCOL=header['SERVER_PROTOCOL'] globals.HEADER.HTTP_HOST=header['HTTP_HOST'] globals.HEADER.BODY_DATA=header['BODY_DATA'] + globals.HEADER.REMOTE_ADDR=header['REMOTE_ADDR'] + globals.HEADER.HTTP_X_REAL_IP=header['HTTP_X_REAL_IP'] try: globals.HEADER.files=header['files'] except: @@ -652,13 +660,13 @@ class web: except: env['REMOTE_ADDR']='' try: - env['HTTP_COOKIE'] + env['HTTP_X_REAL_IP'] except: - env['HTTP_COOKIE']='' + env['HTTP_X_REAL_IP']='' try: - env['REMOTE_ADDR'] + env['HTTP_COOKIE'] except: - env['REMOTE_ADDR']='' + env['HTTP_COOKIE']='' try: env['HTTP_USER_AGENT'] except: @@ -674,6 +682,7 @@ class web: 'REMOTE_ADDR':env['REMOTE_ADDR'], 'HTTP_USER_AGENT':env['HTTP_USER_AGENT'], 'BODY_DATA':env['BODY_DATA'], + 'HTTP_X_REAL_IP':env['HTTP_X_REAL_IP'], 'files':files } p=(config.app['staticpath']+reqheader['RAW_URI'].replace(' ','')) @@ -792,6 +801,7 @@ class web: 'HTTP_HOST':HTTP_HOST, 'HTTP_COOKIE':HTTP_COOKIE, 'REMOTE_ADDR':REMOTE_ADDR, + 'HTTP_X_REAL_IP':'', 'HTTP_USER_AGENT':HTTP_USER_AGENT, 'BODY_DATA':BODY_DATA } @@ -909,6 +919,7 @@ class web: 'HTTP_HOST':HTTP_HOST, 'HTTP_COOKIE':HTTP_COOKIE, 'REMOTE_ADDR':REMOTE_ADDR, + 'HTTP_X_REAL_IP':'', 'HTTP_USER_AGENT':HTTP_USER_AGENT, 'BODY_DATA':BODY_DATA } diff --git a/common/request.py b/common/request.py index 4a65a1d..f186579 100644 --- a/common/request.py +++ b/common/request.py @@ -118,6 +118,17 @@ class HEADER: return kcwglobals.HEADER.HTTP_COOKIE def HTTP_USER_AGENT(): return kcwglobals.HEADER.HTTP_USER_AGENT + def REMOTE_ADDR(): + return kcwglobals.HEADER.REMOTE_ADDR + def HTTP_X_REAL_IP(): + "nginx服务器发送的客户端IP" + return kcwglobals.HEADER.HTTP_X_REAL_IP + def Physical_IP(): + "获取访问用户物理ip" + if kcwglobals.HEADER.HTTP_X_REAL_IP: + return kcwglobals.HEADER.HTTP_X_REAL_IP + else: + return kcwglobals.HEADER.REMOTE_ADDR def get_data(): "获取请求参数体" return kcwglobals.HEADER.BODY_DATA -- Gitee From 8aec14e01bfde134af2980c5cb389035e881431d Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 23 Dec 2020 13:19:49 +0800 Subject: [PATCH 15/18] kun --- Events.py | 2 +- app.py | 10 ++++++++++ common/request.py | 3 +++ config/__init__.py | 4 ++-- setup.py | 2 +- 5 files changed, 17 insertions(+), 4 deletions(-) diff --git a/Events.py b/Events.py index 1e6cd7e..c52d4ef 100644 --- a/Events.py +++ b/Events.py @@ -14,7 +14,7 @@ class MyFileSystemEventHander(FileSystemEventHandler): if time.time()-eventgtimexz > 3: eventgtimexz=time.time() # print('* 更新文件:%s' % event.src_path) - time.sleep(2) + # time.sleep(2) time.sleep(0.2) self.restart() class Events: diff --git a/app.py b/app.py index e44d3b9..d631d60 100644 --- a/app.py +++ b/app.py @@ -73,6 +73,10 @@ class web: env['HTTP_X_REAL_IP']=env['HTTP_X_REAL_IP'] except: env['HTTP_X_REAL_IP']="" + try: + env['url_scheme']=env['HTTP_X_REAL_IP'] + except: + env['url_scheme']=env['wsgi.url_scheme'], status,resheader,body=self.__routes(self,env) if type(body) is bytes: pass @@ -364,6 +368,7 @@ class web: return body,status,resheader def __set_globals(self,header): globals.HEADER.GET=header + # globals.HEADER.url_scheme=header['url_scheme'] globals.HEADER.Method=header['REQUEST_METHOD'] globals.HEADER.URL=header['RAW_URI'] globals.HEADER.PATH_INFO=header['PATH_INFO'] @@ -659,6 +664,10 @@ class web: env['REMOTE_ADDR'] except: env['REMOTE_ADDR']='' + try: + env['wsgi.url_scheme'] + except: + env['wsgi.url_scheme']='' try: env['HTTP_X_REAL_IP'] except: @@ -673,6 +682,7 @@ class web: env['HTTP_USER_AGENT']='' reqheader={ 'REQUEST_METHOD':env['REQUEST_METHOD'], + 'url_scheme':env['wsgi.url_scheme'], 'RAW_URI':env['RAW_URI'], 'PATH_INFO':env['PATH_INFO'], 'QUERY_STRING':env['QUERY_STRING'], diff --git a/common/request.py b/common/request.py index f186579..d566aa3 100644 --- a/common/request.py +++ b/common/request.py @@ -129,6 +129,9 @@ class HEADER: return kcwglobals.HEADER.HTTP_X_REAL_IP else: return kcwglobals.HEADER.REMOTE_ADDR + # def url_scheme(): + # "获取http类型 待测试" + # return kcwglobals.HEADER.url_scheme def get_data(): "获取请求参数体" return kcwglobals.HEADER.BODY_DATA diff --git a/config/__init__.py b/config/__init__.py index dfb4d20..5052181 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -100,7 +100,7 @@ email['recNick']='' #默认收件人昵称 kcweb={} kcweb['name']='kcweb' #项目的名称 -kcweb['version']='4.12.3' #项目版本 +kcweb['version']='4.12.4' #项目版本 kcweb['description']='' #项目的简单描述 kcweb['long_description']='' #项目详细描述 kcweb['license']='MIT' #开源协议 mit开源 @@ -116,7 +116,7 @@ domain={} domain['kcwebfile']="https://file.kwebapp.cn" domain['kcwebstatic']="https://static.kwebapp.cn" domain['kcwebimg']="https://img.kwebapp.cn" -# domain['kcwebapi']="https://kcweb.kwebapp.cn" +# domain['kcwebapi']="//kcweb.kwebapp.cn" domain['kcwebapi']="https://kcweb.kwebapp.cn" #其他配置 diff --git a/setup.py b/setup.py index db8bfac..d7757eb 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,7 @@ def file_get_content(k): return con confkcw={} confkcw['name']='kcweb' #项目的名称 -confkcw['version']='4.12.3' #项目版本 +confkcw['version']='4.12.4' #项目版本 confkcw['description']='' #项目的简单描述 confkcw['long_description']="增加websocket" #项目详细描述 confkcw['license']='MIT License' #开源协议 mit开源 -- Gitee From 09c920d0902ff859a95cacc55bbda59587fc785b Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 23 Dec 2020 13:28:40 +0800 Subject: [PATCH 16/18] kun --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index d7757eb..2c1a93e 100644 --- a/setup.py +++ b/setup.py @@ -1,7 +1,7 @@ # python setup.py sdist upload # twine upload --repository-url https://test.pypi.org/legacy/ dist/* #上传到测试 -# pip install --index-url https://test.pypi.org/simple/ kcweb #安装测试服务上的kcweb +# pip install --index-url https://pypi.org/simple/ kcweb #安装测试服务上的kcweb pip3 install kcweb==4.12.4 -i https://pypi.org/simple/ ############################################# from setuptools import setup, find_packages,Extension import os -- Gitee From bd60b0de9d24b5ffb4792e3bcbc0eaa1a6aaefe7 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 25 Dec 2020 22:59:36 +0800 Subject: [PATCH 17/18] kun --- utill/db/mysql.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/utill/db/mysql.py b/utill/db/mysql.py index 3dffb8d..ac7bdbc 100644 --- a/utill/db/mysql.py +++ b/utill/db/mysql.py @@ -719,20 +719,22 @@ class mysql: 增删改后的任务进行提交 """ - if not self.__config['pattern']: - self.__conn[self.__masteridentifier].commit() - else: - self.__conn[self.__masteridentifier][self.__dbobjident]['obj'].commit() + if self.__masteridentifier: + if not self.__config['pattern']: + self.__conn[self.__masteridentifier].commit() + else: + self.__conn[self.__masteridentifier][self.__dbobjident]['obj'].commit() def rollback(self): """事务回滚 增删改后的任务进行撤销 """ - if not self.__config['pattern']: - self.__conn[self.__masteridentifier].rollback() - else: - self.__conn[self.__masteridentifier][self.__dbobjident]['obj'].rollback() + if self.__masteridentifier: + if not self.__config['pattern']: + self.__conn[self.__masteridentifier].rollback() + else: + self.__conn[self.__masteridentifier][self.__dbobjident]['obj'].rollback() def getsql(self): """得到生成的sql语句""" return self.__sql -- Gitee From 6fe917229fbdde93cb0f6f67e3d6f808bb3ff0fb Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 20 Feb 2021 02:27:10 +0800 Subject: [PATCH 18/18] k --- config/__init__.py | 2 +- setup.py | 2 +- utill/db/mysql.py | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/config/__init__.py b/config/__init__.py index 5052181..938fc68 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -100,7 +100,7 @@ email['recNick']='' #默认收件人昵称 kcweb={} kcweb['name']='kcweb' #项目的名称 -kcweb['version']='4.12.4' #项目版本 +kcweb['version']='4.12.5' #项目版本 kcweb['description']='' #项目的简单描述 kcweb['long_description']='' #项目详细描述 kcweb['license']='MIT' #开源协议 mit开源 diff --git a/setup.py b/setup.py index 2c1a93e..2b3993e 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,7 @@ def file_get_content(k): return con confkcw={} confkcw['name']='kcweb' #项目的名称 -confkcw['version']='4.12.4' #项目版本 +confkcw['version']='4.12.5' #项目版本 confkcw['description']='' #项目的简单描述 confkcw['long_description']="增加websocket" #项目详细描述 confkcw['license']='MIT License' #开源协议 mit开源 diff --git a/utill/db/mysql.py b/utill/db/mysql.py index ac7bdbc..9057064 100644 --- a/utill/db/mysql.py +++ b/utill/db/mysql.py @@ -632,7 +632,9 @@ class mysql: result = self.__cursor.fetchall() #获取查询结果 self.__cursor.close() self.__None() - cou=int(result[0][0]) + cou=result[0][0] + if not cou: + cou=0 return cou def setinc(self,field,key=1,affair=False): -- Gitee