Как я могу выполнить flask API на основе HTML «списка опций» и «кнопки»? - PullRequest
0 голосов
/ 26 марта 2020

Я использую Python + Flask для генерации пары ключей, используя модуль с именем pip cryptography, (с алгоритмами шифрования stati c и stati c размеры клавиш)

Мне нужно сделать их переменными в зависимости от выбора пользователя, поэтому я создал HTML + JS страницу, где пользователь мог выбрать алгоритм и размер ключа в зависимости от своих потребностей

( Example1: USER1 хочет создать пару ключей с использованием Алгоритм "RSA" с использованием Keysize "1024" )

( Example2 : USER2 хочет сгенерировать пару ключей, используя Алгоритм "DSA" , используя Размер ключа "2048" )

Как интегрировать страницу HTML с flask framework, чтобы кнопка "Generate key pair" могла запускать мой python API, и возвращаемое значение зависит от выбора HTML

HTML output

Flask вывод

Низкий уровень знаний по обоим Flask, HTML

Javascript + HTML ЧАСТЬ:

        var select1 = document.getElementById('select1');
        var select2 = document.getElementById('select2');
    var config = {
            'RSA' : [ '1024', '2048', '3072' ],
            'DSA' : [ '1024', '2048', '3072' ],
            'EC' : [ 'prime256v1', 'sect571k1', 'sect571r1', 'brainpoolP512r1' ]
            
    }
    
    var addItemToSelect = function (select, label) {
            var option = document.createElement('option');
                option.textContent = label;
                option.value = label;
                    select.appendChild(option);
    }
    
    
    for (var algo in config) {
      addItemToSelect(select1, algo);
    }
    
    select1.addEventListener('change', function () {
    
        var selection = this.options[this.selectedIndex].value;
        var keysize = config[selection];
    
        select2.length = 0
    
        addItemToSelect(select2, '');
        for (var key in keysize) {
        addItemToSelect(select2, keysize[key]);
      }
    
    });
<!DOCTYPE html>
<html lang="en">

<body>
    <div class="input-group" style="margin-left: 20px;">
        <div>
          <label>Algorithm</label>
          <select class="form-control" id="select1">
            <option></option>
          </select>
        </div>
        <div>
          <label>Key size / Curve</label>
          <select class="form-control" id="select2">
            <option></option>
          </select>
        </div>
      </div>

      <input class="form-control"
      type="button"
      value="Generate key pair">

</body>
</html>

Python + Flask ЧАСТЬ

import yaml
from flask import Flask, render_template, request, jsonify
from flask_restful import Api, Resource
from flask_swagger_ui import get_swaggerui_blueprint
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import rsa, dsa, ec
from cryptography.hazmat.backends import default_backend

app = Flask (__name__)
api = Api (app)

# swagger ui documentation
SWAGGER_URL = '/doc'
API_URL = '/static/swagger.yaml'
SWAGGERUI_BLUEPRINT = get_swaggerui_blueprint(
    SWAGGER_URL,
    API_URL,
    config={
        'app_name': "Keygen"
    }
)
app.register_blueprint(SWAGGERUI_BLUEPRINT, url_prefix=SWAGGER_URL)

# main framework route
@app.route('/', methods=['GET'])
def index():
    return '<h1>CryptoBox (v0.1): The cryptography toolbox</h1>'

# Key generator API route
@app.route('/api/keygen', methods=['POST','GET'])
def keygen():

# generate private/public key pair / RSA / 2048 / 65537
    key = rsa.generate_private_key(backend=default_backend(), public_exponent=65537, \
    key_size=2048)

# get private key in PEM container format / no encryption
    pem_private = key.private_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PrivateFormat.TraditionalOpenSSL,
    encryption_algorithm=serialization.NoEncryption())

# get public key in PEM container format
    pem_public = key.public_key().public_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PublicFormat.SubjectPublicKeyInfo)

# decode to printable strings / utf-8
    private_key_str = pem_private.decode('utf-8')
    public_key_str = pem_public.decode('utf-8')

# output in YAML format
    key_data = {
      "privateKey": private_key_str,
      "publicKey": public_key_str
    }

    return (yaml.dump(key_data, indent=0, sort_keys=True))

if __name__ == '__main__':
    app.run(host='0.0.0.0',port=5000, debug=True)

Спасибо за ваше время и помощь!

1 Ответ

0 голосов
/ 26 марта 2020

Вы можете использовать форму для отправки информации на ваш сервер.

В вашем HTML используйте form, который отправляет ваш маршрут keygen. Обязательно присвойте своим тегам select атрибут name:

<form action="{{url_for('keygen')}}" method="post">
  <label>Algorithm</label>
  <select name="algorithm" class="form-control" id="select1">
    <option></option>
  </select>
  <label>Key size / Curve</label>
  <select name="key_size" class="form-control" id="select2">
    <option></option>
  </select>   
  <input type="submit" value="Generate key pair">
</form>

В своем приложении Flask вы можете извлечь информацию из запроса, используя request.form, используя те же имена, что и вы. указано в ваших select тегах:

@app.route('/api/keygen', methods=['POST','GET'])
def keygen():
    if request.method == 'POST':
        algorithm_string = request.form['algorithm']
        key_size_string = request.form['key_size']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...