Called by :meth:`Flask.register_blueprint` to register all views and callbacks registered on the blueprint with the application. Creates a :class:`.BlueprintSetupState` and calls each :meth:`record` callback with it. :param app: The application this blueprint is bein
(self, app: App, options: dict[str, t.Any])
| 271 | self._blueprints.append((blueprint, options)) |
| 272 | |
| 273 | def register(self, app: App, options: dict[str, t.Any]) -> None: |
| 274 | """Called by :meth:`Flask.register_blueprint` to register all |
| 275 | views and callbacks registered on the blueprint with the |
| 276 | application. Creates a :class:`.BlueprintSetupState` and calls |
| 277 | each :meth:`record` callback with it. |
| 278 | |
| 279 | :param app: The application this blueprint is being registered |
| 280 | with. |
| 281 | :param options: Keyword arguments forwarded from |
| 282 | :meth:`~Flask.register_blueprint`. |
| 283 | |
| 284 | .. versionchanged:: 2.3 |
| 285 | Nested blueprints now correctly apply subdomains. |
| 286 | |
| 287 | .. versionchanged:: 2.1 |
| 288 | Registering the same blueprint with the same name multiple |
| 289 | times is an error. |
| 290 | |
| 291 | .. versionchanged:: 2.0.1 |
| 292 | Nested blueprints are registered with their dotted name. |
| 293 | This allows different blueprints with the same name to be |
| 294 | nested at different locations. |
| 295 | |
| 296 | .. versionchanged:: 2.0.1 |
| 297 | The ``name`` option can be used to change the (pre-dotted) |
| 298 | name the blueprint is registered with. This allows the same |
| 299 | blueprint to be registered multiple times with unique names |
| 300 | for ``url_for``. |
| 301 | """ |
| 302 | name_prefix = options.get("name_prefix", "") |
| 303 | self_name = options.get("name", self.name) |
| 304 | name = f"{name_prefix}.{self_name}".lstrip(".") |
| 305 | |
| 306 | if name in app.blueprints: |
| 307 | bp_desc = "this" if app.blueprints[name] is self else "a different" |
| 308 | existing_at = f" '{name}'" if self_name != name else "" |
| 309 | |
| 310 | raise ValueError( |
| 311 | f"The name '{self_name}' is already registered for" |
| 312 | f" {bp_desc} blueprint{existing_at}. Use 'name=' to" |
| 313 | f" provide a unique name." |
| 314 | ) |
| 315 | |
| 316 | first_bp_registration = not any(bp is self for bp in app.blueprints.values()) |
| 317 | first_name_registration = name not in app.blueprints |
| 318 | |
| 319 | app.blueprints[name] = self |
| 320 | self._got_registered_once = True |
| 321 | state = self.make_setup_state(app, options, first_bp_registration) |
| 322 | |
| 323 | if self.has_static_folder: |
| 324 | state.add_url_rule( |
| 325 | f"{self.static_url_path}/<path:filename>", |
| 326 | view_func=self.send_static_file, # type: ignore[attr-defined] |
| 327 | endpoint="static", |
| 328 | ) |
| 329 | |
| 330 | # Merge blueprint data into parent. |