#python #jquery #ajax #flask #sqlalchemy
#python #jquery #ajax #flask #sqlalchemy
Вопрос:
Я пытаюсь использовать Jquery с Ajax, чтобы проверить, доступно ли имя пользователя или нет, я дважды проверяю код, загружается изображение, но сообщения об имени пользователя не отображаются, и даже загружаемое изображение не скрывается.
Помогите мне найти, что пошло не так, пожалуйста
в Script.js
$(document).ready(function() {
$("#username").on('input', function(e) {
$('#msg').hide();
$('#loading').show();
if($('#username').val() == null || $('#username').val == ""){
$('#msg').show();
$('#msg').html("Username is required field.").css("color", "red");
$('#loading').hide();
}
else{
$.ajax({
type: "POST",
url: "/signup",
data: $('#RegisterForm').serialize(),
dataType: "html",
cache: false,
success: function(msg) {
$('#msg').show();
$('#loading').hide();
$("#msg").html(msg);
},
error: function(jqXHR, textStatus, errorThrown) {
$('#msg').show();
$('#loading').hide();
$("#msg").html(textStatus " " errorThrown);
}
});
}
});
});
python в main.py
@app.route('/signup', methods=['GET', 'POST'])
def signup():
--------
if request.method == 'POST' and form.validate_on_submit():
user = User.query.filter_by(username=form.username.data).first()
if user:
resp = jsonify('<span style="'color:red;'">Username unavailable</span>')
resp.status_code = 200
return resp
else:
resp = jsonify('<span style="'color:green;'">Username available</span>')
resp.status_code = 200
return resp
hashed_password = generate_password_hash(form.password.data, method='sha256')
new_user = User(username=form.username.data, email=form.email.data, password=hashed_password)
try:
---------
else:
-------
return render_template('signup.html', form=form)
WTForms в html
HTML-код
<form class="form-signin" method="POST" action="/signup">
<h2 class="form-signin-heading">Sign Up</h2>
{% for field, errors in form.errors.items() %}
{{ ', '.join(errors) }}
{% endfor %}
{{ form.hidden_tag() }}
{{ wtf.form_field(form.username) }}
<div id="msg"></div>
<span id="loading" style="display: none;"><img src="{{ url_for('.static', filename='images/loading.gif') }}"></span>
{{ wtf.form_field(form.email) }}
{{ wtf.form_field(form.password) }}
{{ wtf.form_field(form.cpassword) }}
<button class="btn btn-lg btn-primary btn-block" type="submit">Sign Up</button>
</form>
</div>
Комментарии:
1. вы пытались увидеть ошибки javascript в консоли
DevTools
JavaScript в Firefox / Chrome2. вы запускали сервер в консоли / терминале, чтобы просмотреть все сообщения об ошибках?
3. использовали ли вы
print()
, чтобы увидеть, что вы получаете на сервере, что вы отправляете на сервер и какая часть кода выполняется? Это называется"print debuging"
4. Я вижу
try
в вашем коде, но .. используете ли выprint()
inexcept
для просмотра ошибок? Если вы используетеexcept: pass
, вы скрываете ошибку и не знаете, в чем проблема.5. У вас есть
if user: ... return resp else: ... return resp
, что означает, что в этом месте он всегда будет выходить из этой функции и никогда не будет выполнять код после этогоif/else
— он никогда не будет запущенhashed_password = ...
. Вы знаете, как это работаетreturn
?
Ответ №1:
- Jsonify ожидает словарь.
jsonify({'message':'ok'})
вместо строки
- Вам нужно на серверной части что-то вроде этого:
# api
@app.route("/check/<username>", methods=["GET"])
def check(username):
has_username = db.session.query(exists().where(User.username == username)).scalar()
return jsonify({"exists": has_username})
Затем в javascript
$('#username-input-id').on('input', function() {
$.getJSON( "/check/" $("#username-input-id").val(), function( data ) {
$("#check").html("<i class='fa fa-list-alt'></i>");
if (data['exists'] === true){
$("#check").html("<i style='color:red;' class='fas fa-exclamation-triangle'></i>");
}
})
});
где #check
выше указан держатель / диапазон для отображения значка, если имя пользователя существует. Настройте его с помощью своего кода.
- Кроме того, flask-wtf позволяет вам делать
{{ form.email() }}
вместо
{{ wtf.form_field(form.email) }}
если вы передали form=form
в качестве переменной