quart-imp/docs/v1/quart_imp_security-pass_function_check.html

326 lines
19 KiB
HTML
Raw Normal View History

2024-08-16 15:09:07 +01:00
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Pass_function_check - Quart_imp.security | Quart-Imp</title>
<link rel="stylesheet" href="static/water.css">
<link rel="stylesheet" href="static/pygments.emacs-dull.css">
<link rel="apple-touch-icon" sizes="180x180" href="static/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="static/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="static/favicon-16x16.png">
<link rel="manifest" href="static/site.webmanifest">
<link rel="mask-icon" href="static/safari-pinned-tab.svg" color="#5bbad5">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="theme-color" content="#ffffff">
</head>
<body>
<aside>
<img src="static/Flask-Imp-Medium.png" alt="Flask-Imp Logo" style="margin-top: 20px; width: 50%">
<h1>Quart-Imp</h1>
<div><small>Version: 1.0.x</small></div>
<div><small>Last Updated:</small></div>
<div><small>Fri, 16 Aug 2024</small></div>
<h2>Menu</h2>
<ul>
<li><a href="index.html"><strong>Index</strong></a></li>
</ul>
<ul>
<li><strong>CLI Commands</strong></li>
<ul>
<li><a href="cli_commands-quart-imp_init.html">quart-imp init</a></li>
<li><a href="cli_commands-quart-imp_blueprint.html">quart-imp blueprint</a></li>
</ul>
<li><strong>Imp</strong></li>
<ul>
<li><a href="imp-introduction.html">Introduction</a></li>
<li><a href="imp-init_app-init.html">init_app, __init__</a></li>
<li><a href="imp-init_session.html">init_session</a></li>
<li><a href="imp-import_app_resources.html">import_app_resources</a></li>
<li><a href="imp-import_blueprint.html">import_blueprint</a></li>
<li><a href="imp-import_blueprints.html">import_blueprints</a></li>
</ul>
<li><strong>ImpBlueprint</strong></li>
<ul>
<li><a href="impblueprint-introduction.html">Introduction</a></li>
<li><a href="impblueprint-init.html">__init__</a></li>
<li><a href="impblueprint-import_resources.html">import_resources</a></li>
<li><a href="impblueprint-import_nested_blueprint.html">import_nested_blueprint</a></li>
<li><a href="impblueprint-import_nested_blueprints.html">import_nested_blueprints</a></li>
<li><a href="impblueprint-tmpl.html">tmpl</a></li>
</ul>
<li><strong>quart_imp.config</strong></li>
<ul>
<li><a href="quart_imp_config-quartconfig.html">QuartConfig</a></li>
<li><a href="quart_imp_config-impconfig.html">ImpConfig</a></li>
<li><a href="quart_imp_config-impblueprintconfig.html">ImpBlueprintConfig</a></li>
</ul>
<li><strong>quart_imp.security</strong></li>
<ul>
<li><a href="quart_imp_security-login_check.html">login_check</a></li>
<li><a href="quart_imp_security-permission_check.html">permission_check</a></li>
<li><a href="quart_imp_security-pass_function_check.html">pass_function_check</a></li>
<li><a href="quart_imp_security-api_login_check.html">api_login_check</a></li>
<li><a href="quart_imp_security-include_csrf.html">include_csrf</a></li>
</ul>
<li><strong>quart_imp.auth</strong></li>
<ul>
<li><a href="quart_imp_auth-encrypt_password.html">encrypt_password</a></li>
<li><a href="quart_imp_auth-authenticate_password.html">authenticate_password</a></li>
<li><a href="quart_imp_auth-generate_password.html">generate_password</a></li>
<li><a href="quart_imp_auth-generate_salt.html">generate_salt</a></li>
<li><a href="quart_imp_auth-generate_csrf_token.html">generate_csrf_token</a></li>
<li><a href="quart_imp_auth-generate_private_key.html">generate_private_key</a></li>
<li><a href="quart_imp_auth-generate_email_validator.html">generate_email_validator</a></li>
<li><a href="quart_imp_auth-generate_numeric_validator.html">generate_numeric_validator</a></li>
<li><a href="quart_imp_auth-generate_alphanumeric_validator.html">generate_alphanumeric_validator</a></li>
<li><a href="quart_imp_auth-is_email_address_valid.html">is_email_address_valid</a></li>
<li><a href="quart_imp_auth-is_username_valid.html">is_username_valid</a></li>
</ul>
</ul>
<div style="padding-top: 5px; margin-bottom: 20px;"><small>Hosted on GitHub Pages.</small></div>
</aside>
<section>
<h1 style="font-size: 2.6rem; margin: 0;">pass_function_check - quart_imp.security</h1>
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">quart_imp.security</span> <span class="kn">import</span> <span class="n">pass_function_check</span>
</pre></div>
<div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">pass_function_check</span><span class="p">(</span>
<span class="n">function</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">,</span>
<span class="n">predefined_args</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Dict</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">fail_endpoint</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">pass_endpoint</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">endpoint_kwargs</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">t</span><span class="o">.</span><span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">]]]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">message</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">message_category</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;message&quot;</span><span class="p">,</span>
<span class="n">fail_on_missing_kwargs</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
<span class="n">with_app_context</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
<span class="p">)</span>
</pre></div>
<p><strong>NOTE: This was added mostly as an experimental feature, but ended up being useful in some cases.</strong></p>
<p>A decorator that takes the result of a function and checks if it is True or False.</p>
<p>URL variables from <code>@route</code> will be read by this decorator.
To use URL variables in your passed in function,
make sure your functions argument(s) name(s) match the name(s) of the URL variable(s).</p>
<p><strong>Example:</strong></p>
<div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">check_if_number</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">int</span><span class="p">):</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="nd">@bp</span><span class="o">.</span><span class="n">route</span><span class="p">(</span><span class="s2">&quot;/admin-page/&lt;int:value&gt;&quot;</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;GET&quot;</span><span class="p">])</span>
<span class="nd">@login_check</span><span class="p">(</span><span class="s1">&#39;logged_in&#39;</span><span class="p">,</span> <span class="kc">True</span><span class="p">,</span> <span class="s1">&#39;blueprint.login_page&#39;</span><span class="p">)</span> <span class="c1"># can be mixed with login_check</span>
<span class="nd">@pass_function_check</span><span class="p">(</span>
<span class="n">check_if_number</span><span class="p">,</span>
<span class="n">predefined_args</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">fail_endpoint</span><span class="o">=</span><span class="s1">&#39;www.index&#39;</span><span class="p">,</span>
<span class="n">message</span><span class="o">=</span><span class="s2">&quot;Failed message&quot;</span>
<span class="p">)</span>
<span class="k">async</span> <span class="k">def</span> <span class="nf">admin_page</span><span class="p">():</span>
<span class="o">...</span>
<span class="nd">@bp</span><span class="o">.</span><span class="n">route</span><span class="p">(</span><span class="s2">&quot;/admin-page/&lt;int:value&gt;&quot;</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;GET&quot;</span><span class="p">])</span>
<span class="nd">@login_check</span><span class="p">(</span><span class="s1">&#39;logged_in&#39;</span><span class="p">,</span> <span class="kc">True</span><span class="p">,</span> <span class="s1">&#39;blueprint.login_page&#39;</span><span class="p">)</span> <span class="c1"># can be mixed with login_check</span>
<span class="nd">@pass_function_check</span><span class="p">(</span>
<span class="n">check_if_number</span><span class="p">,</span>
<span class="n">predefined_args</span><span class="o">=</span><span class="p">{</span><span class="s1">&#39;value&#39;</span><span class="p">:</span> <span class="mi">10</span><span class="p">},</span>
<span class="n">fail_endpoint</span><span class="o">=</span><span class="s1">&#39;www.index&#39;</span><span class="p">,</span>
<span class="n">message</span><span class="o">=</span><span class="s2">&quot;Failed message&quot;</span>
<span class="p">)</span>
<span class="k">async</span> <span class="k">def</span> <span class="nf">admin_page_overwrite</span><span class="p">():</span>
<span class="o">...</span>
</pre></div>
<p><strong>Advanced use case:</strong></p>
<p>Here's an example of accessing quart.session from within the passed in function. including the
<code>with_app_context</code> parameter, the function will be called with <code>app_context()</code>.</p>
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">quart</span> <span class="kn">import</span> <span class="n">current_app</span>
<span class="kn">from</span> <span class="nn">quart</span> <span class="kn">import</span> <span class="n">session</span>
<span class="o">...</span>
<span class="k">def</span> <span class="nf">check_if_number</span><span class="p">(</span><span class="n">number</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">session_</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="k">if</span> <span class="n">session_</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">session_</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="nb">int</span><span class="p">(</span><span class="n">number</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="nd">@bp</span><span class="o">.</span><span class="n">route</span><span class="p">(</span><span class="s2">&quot;/pass-func-check-with-url-var/&lt;number&gt;&quot;</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;GET&quot;</span><span class="p">])</span>
<span class="nd">@pass_function_check</span><span class="p">(</span>
<span class="n">check_if_number</span><span class="p">,</span>
<span class="n">predefined_args</span><span class="o">=</span><span class="p">{</span><span class="s1">&#39;number&#39;</span><span class="p">:</span> <span class="mi">10</span><span class="p">,</span> <span class="s1">&#39;session_&#39;</span><span class="p">:</span> <span class="n">session</span><span class="p">},</span>
<span class="n">fail_endpoint</span><span class="o">=</span><span class="s2">&quot;www.index&quot;</span><span class="p">,</span>
<span class="n">with_app_context</span><span class="o">=</span><span class="kc">True</span>
<span class="p">)</span>
<span class="k">async</span> <span class="k">def</span> <span class="nf">admin_page_overwrite_with_session</span><span class="p">():</span>
<span class="o">...</span>
</pre></div>
<p>If you pass in a predefined arg that has the same key name as a session variable that exists, the value
of that predefined arg will be replaced with the session variable value.</p>
<div class="highlight"><pre><span></span><span class="n">session</span><span class="p">[</span><span class="s1">&#39;car&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;Toyota&#39;</span>
<span class="o">...</span>
<span class="k">def</span> <span class="nf">check_function</span><span class="p">(</span><span class="n">car</span><span class="p">):</span>
<span class="k">if</span> <span class="n">car</span> <span class="o">==</span> <span class="s1">&#39;Toyota&#39;</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="o">...</span>
<span class="nd">@bp</span><span class="o">.</span><span class="n">route</span><span class="p">(</span><span class="s2">&quot;/pass-func-check-with-url-var/&lt;number&gt;&quot;</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;GET&quot;</span><span class="p">])</span>
<span class="nd">@pass_function_check</span><span class="p">(</span>
<span class="n">check_function</span><span class="p">,</span>
<span class="n">predefined_args</span><span class="o">=</span><span class="p">{</span><span class="s1">&#39;car&#39;</span><span class="p">:</span> <span class="n">session</span><span class="p">},</span>
<span class="o">...</span>
</pre></div>
<p>This will pass, as pass_function_check will replace the value of the predefined arg 'car' with the value
of the session variable 'car'.</p>
</section>
</body>
</html>