GVKun编程网logo

Flask('application')与Flask(__ name__)

13

对于Flask感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解'application'与Flask,并且为您提供关于angularjs–controller:ctrlfmt糟糕的控制器字符

对于Flask感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解'application'与Flask,并且为您提供关于angularjs – controller:ctrlfmt糟糕的控制器字符串”.必须匹配`__name__ as __id__`或`__name__`、app = Flask(__name__) 是个什么东西、Flash 之ANE的applicationDeployment.nativeLibrary ...、Flask 上下文以及 python__setattr__常见问题的宝贵知识。

本文目录一览:

Flask('application')与Flask(__ name__)

Flask('application')与Flask(__ name__)

在官方的快速入门中,建议__name__在使用单个 模块 时使用:

2.
…如果您使用的是单个模块(如本例所示),则应使用,__name__因为取决于它是作为应用程序启动还是作为模块导入,其名称将有所不同(''__main__''与实际导入名称不同)。…

但是,在他们的API文档中,当我的应用程序为 软件包 时,建议进行硬编码:

因此,您在此处提供的内容很重要。如果使用单个模块,__name__则始终为正确的值。但是,如果您使用的是包,通常建议在其中硬编码包的名称。

我能理解为什么硬编码包名更好,但是为什么不硬编码单个模块名呢?或者,换句话说,Flask当它收到__main__第一个参数时可以得到什么信息?我看不到这如何使Flask更容易找到资源…

答案1

小编典典

__name__只是获取应用定义位置的导入名称的便捷方法。Flask使用导入名称来知道在哪里查找资源,模板,静态文件,实例文件夹等。使用包时,如果在其中定义应用程序,__init__.py__name__仍然会指向相对于资源所在的“正确”位置是。但是,如果您在其他地方定义它(例如)mypackage/app.py,则using__name__将告诉Flask寻找相对于mypackage.app而不是的资源mypackage

使用__name__与“硬编码”不正交,它只是使用包名称的捷径。而且也没有理由说名称 应该 是基本包,这完全取决于您的项目结构。

angularjs – controller:ctrlfmt糟糕的控制器字符串”.必须匹配`__name__ as __id__`或`__name__`

angularjs – controller:ctrlfmt糟糕的控制器字符串”.必须匹配`__name__ as __id__`或`__name__`

在rootes.js中

.state('main.mydata',{
    url: '/my-data',templateUrl: '/app/views/pages/my-data.html',controller: 'mydataCtrl'
})

调节器

.controller('mydataCtrl',['$scope','$state','$http',function($scope,$state,$http) {
    console.log("Came to My Data")
}])

当我在控制台中调用页面时出错

Error: angular.js?bundleVirtualPath=~%2fbundles%2fangular:13708 [$controller:ctrlfmt] Badly formed controller string ''. Must match `__name__ as __id__` or `__name__`.
http://errors.angularjs.org/1.5.7/$controller/ctrlfmt?p0=
    at http://localhost:25282/Scripts/angular.js?bundleVirtualPath=%7eNaNbundles%fangular:68:12
    at $controller (http://localhost:25282/Scripts/angular.js?bundleVirtualPath=%7e%fbundles%fangular:10199:17)
    at setupControllers (http://localhost:25282/Scripts/angular.js?bundleVirtualPath=%7e%fbundles%fangular:9331:34)
    at nodeLinkFn (http://localhost:25282/Scripts/angular.js?bundleVirtualPath=%7e%fbundles%fangular:9116:32)
    at compositeLinkFn (http://localhost:25282/Scripts/angular.js?bundleVirtualPath=%7e%fbundles%fangular:8510:13)
    at nodeLinkFn (http://localhost:25282/Scripts/angular.js?bundleVirtualPath=%7e%fbundles%fangular:9210:24)
    at compositeLinkFn (http://localhost:25282/Scripts/angular.js?bundleVirtualPath=%7e%fbundles%fangular:8510:13)
    at compositeLinkFn (http://localhost:25282/Scripts/angular.js?bundleVirtualPath=%7e%fbundles%fangular:8513:13)
    at compositeLinkFn (http://localhost:25282/Scripts/angular.js?bundleVirtualPath=%7e%fbundles%fangular:8513:13)
    at publicLinkFn (http://localhost:25282/Scripts/angular.js?bundleVirtualPath=%7e%fbundles%fangular:8390:30)

可能是什么问题?

解决方法

在页面中

my-data.html

div有空控制器名称

<div ng-controller="">
  ..
</div>

因为它显示了

Badly formed controller

app = Flask(__name__) 是个什么东西

app = Flask(__name__) 是个什么东西

"""第一部分,初始化:所有的Flask都必须创建程序实例,
web服务器使用wsgi协议,把客户端所有的请求都转发给这个程序实例
程序实例是Flask的对象,一般情况下用如下方法实例化
Flask类只有一个必须指定的参数,即程序主模块或者包的名字,__name__是系统变量,该变量指的是本py文件的文件名"""

from flask import Flask
app = Flask(__name__)

#  第二部分,路由和视图函数:
#  客户端发送url给web服务器,web服务器将url转发给flask程序实例,程序实例
#  需要知道对于每一个url请求启动那一部分代码,所以保存了一个url和python函数的映射关系。
#  处理url和函数之间关系的程序,称为路由
#  在flask中,定义路由最简便的方式,是使用程序实例的app.route装饰器,把装饰的函数注册为路由

@app.route(''/'')
def hello_world():
    return __name__


#  第三部分:程序实例用run方法启动flask集成的开发web服务器
#  __name__ == ''__main__''是python常用的方法,表示只有直接启动本脚本时候,才用app.run方法
#  如果是其他脚本调用本脚本,程序假定父级脚本会启用不同的服务器,因此不用执行app.run()
#  服务器启动后,会启动轮询,等待并处理请求。轮询会一直请求,直到程序停止。

if __name__ == ''__main__'':
    print(''dd'',__name__)
    app.run()
  • 如上述代码所示,app是flask的实例,功能就是接受来自web服务器的请求
  1. 浏览器将请求给web服务器,web服务器将请求给app ,
  2. app收到请求,通过路由找到对应的视图函数,然后将请求处理,得到一个响应response
  3. 然后app将响应返回给web服务器,
  4. web服务器返回给浏览器,
  5. 浏览器展示给用户观看,流程完毕。

Flash 之ANE的applicationDeployment.nativeLibrary ...

Flash 之ANE的applicationDeployment.nativeLibrary ...

项目介绍:Flash调用Android(采用ANE)

问题:今天在做整合三方支付的时候发现如下问题,

D:\project\flash\Xxxx-lib-d\src\extension.xml(25): error 105: extension.platforms.platform.applicationDeployment.nativeLibrary contains an invalid value

查到

<extension xmlns="http://ns.adobe.com/air/extension/3.1">
  <id>com.aaa.xxxx.d</id>
  <versionNumber>1</versionNumber>
  <platforms>
    <platform name="Android-ARM">
      <applicationDeployment> <nativeLibrary>xxxx_d.jar</nativeLibrary> <initializer>com.aaa.xxxx.d.XxxxExtension</initializer>
        <finalizer>com.aaa.xxxx.d.XxxxExtension</finalizer>
      </applicationDeployment>
    </platform>
  </platforms>
</extension>


问题在下面一行

<nativeLibrary>xxxx_d.jar</nativeLibrary>
由于jar包的名称包含“_”,直接修改包名,去掉下划线

<extension xmlns="http://ns.adobe.com/air/extension/3.1">
  <id>com.aaa.xxxx.d</id>
  <versionNumber>1</versionNumber>
  <platforms>
    <platform name="Android-ARM">
      <applicationDeployment> <nativeLibrary>xxxxd.jar</nativeLibrary> <initializer>com.aaa.xxxx.d.XxxxExtension</initializer>
        <finalizer>com.aaa.xxxx.d.XxxxExtension</finalizer>
      </applicationDeployment>
    </platform>
  </platforms>
</extension>
问题解决,感觉还不够了解flash!!


Flask 上下文以及 python__setattr__常见问题

Flask 上下文以及 python__setattr__常见问题

Flask 上下文管理
-threading.local 对象,用于为每个线程开辟一块空间来保存它独有的值。
- 源码(request)
    - 情况一:单进程单线程,基于全局变量做。
    - 情况二:单进程多线程,threading.local 对象。
    - 情况三:单进程单线程(多协程),threading.lcoal 对象做不到。
- 建议:
    - 以后不支持协程:就用 threading.local 对象
    - 支持协程:自定义类似 threading.local 对象
 
线程
通过 threading.local () 保护线程数据安全
 1 import threading
 2 local_values = threading.local()
 3 
 4 ''''''
 5 local_values = threading.local()就是起到一个锁的作用,每个线程都可以对threading.local对象进行读写,且互相不干扰。
 6 用于为每个线程开辟一块空间来保存它独有的值。
 7 ''''''
 8 def func(num):
 9     local_values.name=num
10     import time
11     time.sleep(1)
12     print(local_values.name,threading.current_thread().name)
13 
14 for i in range(10):
15     th = threading.Thread(target=func,args=(i,),name="线程是%s"%i)
16     th.start()

 
 
一个简单的自定义方法实现 threading.local 功能:
线程
 1 import threading
 2 from _thread import get_ident
 3 ''''''获取线程唯一标示''''''
 4 class LOCAL(object):
 5     ''''''
 6     通过自定义的方式实现threadlocal的功能
 7     初始化的时候定义一个字典以及线程唯一标示
 8     然后通过set设置k,v,再用get取值
 9     ''''''
10     def __init__(self):
11         self.storage = {}
12         self.get_ident = get_ident
13     def set(self,k,v):
14         ident = self.get_ident()
15         origin = self.storage.get(ident)
16         if not origin:
17             origin = {k:v}
18         else:
19             origin[k] = v
20         self.storage[ident] = origin
21     def get(self,k):
22         ident = self.get_ident()
23         origin = self.storage.get(ident)
24         if not origin:
25             return  None
26         return origin.get(k,None)
27 
28 local_values = LOCAL()
29 def task(num):
30     local_values.set(''name'',num)
31     import time
32     time.sleep(1)
33     print(local_values.get(''name''), threading.current_thread().name)
34 for i in range(10):
35     th = threading.Thread(target=task,args=(i,),name="线程是%s"%i)
36     th.start()
通过安装 gevent,用 getcurrent 的方式获取 协程的唯一标示:
以下是实现协程的单独资源管理
 1 import threading
 2 from greenlet import getcurrent as get_ident
 3 ''''''获取协程唯一标示,需要安装gevent,同时自动安装greenlet,通过
 4 from greenlet import getcurrent 模块判断协程唯一标示,其他代码不变''''''
 5 class LOCAL(object):
 6     ''''''
 7     通过自定义的方式实现threadlocal的功能
 8     初始化的时候定义一个字典以及线程唯一标示
 9     然后通过set设置k,v,再用get取值
10     ''''''
11     def __init__(self):
12         self.storage = {}
13         self.get_ident = get_ident
14     def set(self,k,v):
15         ident = self.get_ident()
16         origin = self.storage.get(ident)
17         if not origin:
18             origin = {k:v}
19         else:
20             origin[k] = v
21         self.storage[ident] = origin
22     def get(self,k):
23         ident = self.get_ident()
24         origin = self.storage.get(ident)
25         if not origin:
26             return  None
27         return origin.get(k,None)
28 
29 local_values = LOCAL()
30 def task(num):
31     local_values.set(''name'',num)
32     import time
33     time.sleep(1)
34     print(local_values.get(''name''), threading.current_thread().name)
35 for i in range(10):
36     th = threading.Thread(target=task,args=(i,),name="线程是%s"%i)
37     th.start()
 
 
面向对象知识点补充
关于__setattr__的使用以及常见问题:
 1 #扩展内容,__setattr__
 2 class Foo(object):
 3     def set(self,k,v):
 4         pass
 5     def __setattr__(self, key, value):
 6         print(key,value)
 7         pass
 8 
 9 obj = Foo()
10 obj.set(''x'',123)
11 obj.x = 123 #用__setattr__比set函数要方便许多
12 
13 #__setattr__方法常见的坑
14 
15 class Foo(object):
16     def __init__(self):
17         self.storage = {}
18     def __setattr__(self, key, value):
19         self.storage={''k1'':''v1''}
20         print(key,value)
21     def __getattr__(self, item):
22         print(item)
23 
24 
25 obj = Foo()
26 obj.x = 123
27 ''''''
28 当初始化的时候,self.storage,对象调用storage就会自动执行__setattr__方法,
29 然后__setattr__方法里面又是对象调用属性,就会再执行setattr,这样就是无限递归了。
30 为了避免这个问题需要用下面这种方式实现:
31 ''''''
32 class Foo(object):
33     def __init__(self):
34         object.__setattr__(self,''storage'',{})
35 
36     def __setattr__(self, key, value):
37         self.storage={''k1'':''v1''}
38         print(key,value)
39 
40     def __getattr__(self, item):
41         print(item)
42         return "sdf"
43 obj = Foo()
44 #注意如果obj.x = 123就会触发__setattr__方法,还是会出现递归的问题。

 

以下为参考源码实现的方式:
 1 #源码的实现方式:
 2 import threading
 3 try:
 4     from greenlet import getcurrent as get_ident # 协程
 5 except ImportError:
 6     try:
 7         from thread import get_ident
 8     except ImportError:
 9         from _thread import get_ident # 线程
10 
11 
12 class Local(object):
13 
14     def __init__(self):
15         object.__setattr__(self, ''__storage__'', {})
16         object.__setattr__(self, ''__ident_func__'', get_ident)
17 
18 
19     def __getattr__(self, name):
20         try:
21             return self.__storage__[self.__ident_func__()][name]
22         except KeyError:
23             raise AttributeError(name)
24 
25     def __setattr__(self, name, value):
26         ident = self.__ident_func__()
27         storage = self.__storage__
28         try:
29             storage[ident][name] = value
30         except KeyError:
31             storage[ident] = {name: value}
32 
33     def __delattr__(self, name):
34         try:
35             del self.__storage__[self.__ident_func__()][name]
36         except KeyError:
37             raise AttributeError(name)
38 
39 
40 local_values = Local()
41 
42 
43 def task(num):
44     local_values.name = num
45     import time
46     time.sleep(1)
47     print(local_values.name, threading.current_thread().name)
48 
49 
50 for i in range(20):
51     th = threading.Thread(target=task, args=(i,),name=''线程%s'' % i)
52     th.start()

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

关于Flask'application'与Flask的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于angularjs – controller:ctrlfmt糟糕的控制器字符串”.必须匹配`__name__ as __id__`或`__name__`、app = Flask(__name__) 是个什么东西、Flash 之ANE的applicationDeployment.nativeLibrary ...、Flask 上下文以及 python__setattr__常见问题的相关知识,请在本站寻找。

本文标签: