Девять, Джанго замки, сделка, AJAX

Во-первых, операции и замки

  1. замок на уровне строк

select_for_update внимание должно быть использован в транзакции

select_for_update (NOWAIT = False, skip_locked = False)

entries = Entry.objects.select_for_update().filter(author=request.user)  #加互斥锁,由于mysql在查询时自动加的是共享锁,所以我们可以手动加上互斥锁。create、update、delete操作时,mysql自动加行级互斥锁

select * from t1 where id=1 for update;
models.T1.objects.select_for_update().fitler(id=1)

Все соответствующие строки не будут заблокированы до конца сделки. Это означает, что данные могут быть заблокированы для предотвращения других транзакций изменения.

  1. дела

Первый способ: глобальный

Этот подход все более унифицированные SQL запросов HTTP размещаются в соответствующем исполнении сделки (либо все получится, или все остальное терпит неудачу), является глобальной конфигурации

在settings文件中:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mxshop',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'USER': 'root',
        'PASSWORD': '123',
        'OPTIONS': {
            "init_command": "SET default_storage_engine='INNODB'",
       #'init_command': "SET sql_mode='STRICT_TRANS_TABLES'", #配置开启严格sql模式


        }
        "ATOMIC_REQUESTS": True, #全局开启事务,绑定的是http请求响应整个过程
        "AUTOCOMMIT":False, #全局取消自动提交,慎用
    },
  'other':{
    'ENGINE': 'django.db.backends.mysql', 
            ......
  } #还可以配置其他数据库
}

Второй способ: местный

Достигается кодового блока атомной операции

from django.db import transaction  # 导入transaction

在视图函数中加:
@transaction.non_atomic_requests
def index(request):
    pass (orm...sql..语句)
    return xxx

上下文逻辑里面加:
def index(request):
    ..
    with transaction.atomic():  # 设置事务的保存点
        pass orm...sql..
    ...
    return xxx

Во-вторых, Ajax

  1. Краткое введение

    AJAX (Asynchronous Javascript и XML), переводится на китайский язык является «Asynchronous JavaScript и XML», что использование Javascript языка для взаимодействия с сервером асинхронной передачи данных, как XML.

    Самое большое преимущество является AJAX без перезагрузки всей страницы, вы можете обмениваться данными с сервером и обновлением частями содержимого страницы. (Эта функция является чувством пользовательского запроса и ответа процесс завершается незнание)

    AJAX не требует каких-либо подключаемые модули браузера, но требует, чтобы пользователь разрешить выполнение JavaScript в браузере

В дополнение к асинхронным функции AJAX, а другой: частично обновления страницы браузера;

  • Асинхронное взаимодействие: клиент посылает запрос на сервер, не дожидаясь конца ответа, он может выдать второй запрос
  • Частичное обновление: эта характеристика ощущение к процессу запроса пользователя и ответа завершается незнание
  1. Обычный пример аутентификации Войти

Прежде всего не АЯКС, полный интерфейс аутентификации Войти

  1. Настройка URL - адреса маршрутизации
    от импорта app01 рассматривает
    в urlpatterns = [
    URL (R & LT 'Логин ^ /', views.LoginView.as_view (), имя = 'Войти'),
    # который сконфигурирован путь начинается , когда ОЦК
    ]

  2. Функция просмотра осуществляется ОЦК
    от рендер django.shortcuts Импорт, то HttpResponse, редирект
    с django.views Import View

    class LoginView(View):
        def get(self,request):
            return render(request,'login.html')
    
        def post(self,request):
            name = request.POST.get('username')
            pwd = request.POST.get('password')
            if name=='yangzm' and pwd=='123':
                return render(request,'index.html')
            else:
                return redirect('login')
  3. Полные два HTML - файлы, login.html используется для завершения входа в систему возможности, index.html файл для завершения отображения страницы после успешного входа в систему , имя пользователя , если неверный пароль, то переадресация будет login.html страница
    # login.html

    Добро пожаловать на страницу входа



    {% Csrf_token%}
    Имя пользователя:
    Пароль:

    # index.html
    <p>登录成功</p>
    <p>欢迎大佬到来</p>
  4. Результаты и анализ недостатков ,
    когда вводимый пользователя 127.0.0.1:8000/login/, отображает страницу входа
    для входа успешной индексной страницы скачки, то Войти терпят неудачу снова вернуться на эту страницу

    Анализ Минусы: Когда пользователь вводит информацию не в нужное время, так как сделать переадресацию, нажмите на кнопку отправить, обновите страницу, перейти обратно на страницу входа, то страница запрашивается снова, ранее введенные данные будут удалены , так что пользователь опыт очень плохие
    цели для улучшения: пользователь вводит неправильный, вы хотите сохранить предыдущую информацию, и предлагает пользователю ввести неправильный, то пусть пользовательский ввод на содержание реформы, улучшить пользовательский опыт, этот когда вам нужно использовать Ajax для завершения этой функции

  5. Примеры Ajax аутентификации Войти на основе полной

  6. JQuery Ajax нужно использовать файл, файл вводится в статической конфигурации
    # Настройка параметров:
    STATICFILES_DIRS = [
    в os.path.join (base_dir, «статики к»)
    ]

    # 新建文件夹statics,放静态文件 jquery.js
  7. В это время, файл нужно ввести файл login.html Jquery, а затем написать JS код , который реализует Ajax
    {%} статическая нагрузка%

    <body>
    <h1>欢迎来到登录页面</h1>
    
    <form action="/login/" method="post">
        {% csrf_token %}
        用户名:<input type="text" id="username" name="username">
        密  码:<input type="password" id="password" name="password">
        <input type="button" id="btn" value="提交">
        <span style="color: red;font-size: 12px" id="error"></span>
    </form>
    
    
    <script src="{% static 'jquery.js' %}"></script>
    <script>
        $('#btn').click(function () {
            $.ajax({
                url:'/login/',
                type:'post',
                data:{
                    uname:$('#username').val(),
                    pwd:$('#password').val(),
                    csrfmiddlewaretoken:$('[name=csrfmiddlewaretoken]').val()
                    # 这是为了通过post提交的认证机制
    
                },
                success:function (res) {
                    var resStr = JSON.parse(res);
                    if(resStr['code'] === 3){
                        $('#error').text(resStr['redirect_url'])
                    }
                    else if(resStr['code'] === 0){
                        location.href=resStr['redirect_url'];
                    }
                }
            })
        })
    </script>
    
    </body>
  8. URL нужно перенастроить индекс пути успешного входа
    в urlpatterns = [
    URL (R & л 'ADMIN ^ /', admin.site.urls),
    гиперссылка (R & л 'Логин ^ /', views.LoginView.as_view (), имя = «Войти '),
    URL - адрес (R & л' индекс ^ /», views.index),
    ]

  9. 视图函数вид
    из django.shortcuts импортируют визуализации, HttpResponse, перенаправлять

    # Create your views here.
    
    from django.views import View
    
    class LoginView(View):
        def get(self,request):
            return render(request,'login.html')
    
        def post(self,request):
            name = request.POST.get('uname')
            pwd = request.POST.get('pwd')
            if name=='yangzm' and pwd=='123':
                ret = '{"code":0,"redirect_url":"/index/"}'
                return HttpResponse(ret)
            else:
                ret = '{"code":3,"redirect_url":"用户名密码错误!!!"}'
                return HttpResponse(ret)
    
    def index(request):
    
        return render(request,'index.html')
  10. результат

    В этом случае ввел неверное имя пользователя и пароль, не не обновите страницу, чтобы отобразить оперативную информацию, сохранить исходные данные, до ввода успешного перехода на страницу входа
  11. Путь импорт внешней JS файл, чтобы написать код, а затем написать код JS не может быть Джанго синтаксис шаблона, так как порядок HTML загрузки файл: url-- просмотр --html рендеринга шаблона --- возвращение в браузер - браузер рендеринг - - srcipt ГНЦ - прежде чем запросить файл JS - то код JS файла теперь будет загружаться только в ваш HTML документ - нет шаблона рендеринга шагов - и нет никакого способа, чтобы заменить соответствующий синтаксис шаблона.

рекомендация

отwww.cnblogs.com/yangzm/p/11272687.html