1717from .wtf import WtfBaseField
1818
1919
20- def redirect_connection_calls (cls ):
21- """
22- Monkey-patch mongoengine's connection methods so that they use
23- Flask-MongoEngine's equivalents.
24-
25- Given a random mongoengine class (`cls`), get the module it's in,
26- and iterate through all of that module's members to find the
27- particular methods we want to monkey-patch.
28- """
29- # TODO this is so whack... Why don't we pass particular connection
30- # settings down to mongoengine and just use their original implementation?
31-
32- # Map of mongoengine method/variable names and flask-mongoengine
33- # methods they should point to
34- connection_methods = {
35- 'get_db' : get_db ,
36- 'DEFAULT_CONNECTION_NAME' : DEFAULT_CONNECTION_NAME ,
37- 'get_connection' : get_connection
38- }
39- cls_module = inspect .getmodule (cls )
40- if cls_module != mongoengine .connection :
41- for attr in inspect .getmembers (cls_module ):
42- n = attr [0 ]
43- if n in connection_methods :
44- setattr (cls_module , n , connection_methods [n ])
45-
46-
4720def _patch_base_field (obj , name ):
4821 """
4922 If the object submitted has a class whose base class is
@@ -60,6 +33,8 @@ def _patch_base_field(obj, name):
6033 @param obj: MongoEngine instance in which we should locate the class.
6134 @param name: Name of an attribute which may or may not be a BaseField.
6235 """
36+ # TODO is there a less hacky way to accomplish the same level of
37+ # extensibility/control?
6338
6439 # get an attribute of the MongoEngine class and return if it's not
6540 # a class
@@ -80,7 +55,6 @@ def _patch_base_field(obj, name):
8055 # re-assign the class back to the MongoEngine instance
8156 delattr (obj , name )
8257 setattr (obj , name , cls )
83- redirect_connection_calls (cls )
8458
8559
8660def _include_mongoengine (obj ):
@@ -100,10 +74,7 @@ def _include_mongoengine(obj):
10074
10175
10276def current_mongoengine_instance ():
103- """
104- Obtain instance of MongoEngine in the
105- current working app instance.
106- """
77+ """Return a MongoEngine instance associated with current Flask app."""
10778 me = current_app .extensions .get ('mongoengine' , {})
10879 for k , v in me .items ():
10980 if isinstance (k , MongoEngine ):
@@ -140,36 +111,22 @@ def init_app(self, app, config=None):
140111 raise Exception ('Extension already initialized' )
141112
142113 if not config :
143- # If not passed a config then we
144- # read the connection settings from
145- # the app config.
114+ # If not passed a config then we read the connection settings
115+ # from the app config.
146116 config = app .config
147117
148- # Obtain db connection
149- connection = create_connection (config , app )
118+ # Obtain db connection(s)
119+ connections = create_connections (config )
150120
151- # Store objects in application instance
152- # so that multiple apps do not end up
153- # accessing the same objects.
154- s = {'app' : app , 'conn' : connection }
121+ # Store objects in application instance so that multiple apps do not
122+ # end up accessing the same objects.
123+ s = {'app' : app , 'conn' : connections }
155124 app .extensions ['mongoengine' ][self ] = s
156125
157- def disconnect (self ):
158- """Close all connections to MongoDB."""
159- conn_settings = fetch_connection_settings (current_app .config )
160- if isinstance (conn_settings , list ):
161- for setting in conn_settings :
162- alias = setting .get ('alias' , DEFAULT_CONNECTION_NAME )
163- disconnect (alias , setting .get ('preserve_temp_db' , False ))
164- else :
165- alias = conn_settings .get ('alias' , DEFAULT_CONNECTION_NAME )
166- disconnect (alias , conn_settings .get ('preserve_temp_db' , False ))
167- return True
168-
169126 @property
170127 def connection (self ):
171128 """
172- Return MongoDB connection associated with this MongoEngine
129+ Return MongoDB connection(s) associated with this MongoEngine
173130 instance.
174131 """
175132 return current_app .extensions ['mongoengine' ][self ]['conn' ]
0 commit comments