西方记者 发表于 2020-7-25 11:31

AJAX异步请求Django数据

<script>
                                                                //setInterval(
                                                                  //function test() {
                                                                  $.ajax({
                                        type:"POST",
                                        //提交方式
                                        url:"{% url 'hello' %}",
                                        //提交地址
                                        data:{
                                          'xixi':123
                                        },
                                        headers:{ "X-CSRFToken":$.cookie('csrftoken') },
                                        //提交的数据
                                        dataType:"text",
                                        //传输格式
                                        success:function(data){
                                          //回调函数,data接收的为异步提交返回结果
                                          //alert(data)
                                          $("#FlowTest").html(data);
                                          // "FlowTest"指的是需要刷新的div
                                        },
                                        error:function () {
                                          alert("获取数据异常");
                                        }
                                    });
                                                                //},1000)
</script>
views.py
def hello(request):
    context = {}
    #context['hello']='hello world!'
    #return render(request,'hello.html',context)

    print(request.POST)
    person = {
       # 'UserName': 'balabala',
      'Age': 18,
       # 'Height': 187
    }
    #response = JsonResponse(person)
    return JsonResponse(person)
小白参考网上的博文,想通过AJAX发送请求把Django数据传到js中,但是每次运行QueryDict总是为空(正常其中内容应该为我ajax发送的数据)
Not Found: /
"GET / HTTP/1.1" 404 1945
Not Found: /favicon.ico
"GET /favicon.ico HTTP/1.1" 404 1996
"GET /hello/ HTTP/1.1" 200 11
<QueryDict: {}>

jimo 发表于 2020-7-25 13:00

这个排版。。我不知道你在说啥

西方记者 发表于 2020-7-25 15:22

jimo 发表于 2020-7-25 13:00
这个排版。。我不知道你在说啥

第一次发帖请见谅{:1_907:},就是想做到AJAX向Django发起请求,然后Django响应请求发送数据回去,但貌似在ajax发送请求处就出了问题{:1_924:}

不忘初心哟 发表于 2020-7-25 17:06

Url:
from django.conf.urls import url
from django.contrib import admin
from ajax_app import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index.html$', views.index),
    url(r'^ajax1.html$', views.ajax1),                  #提交的数据
]

视图函数
from django.shortcuts import render,HttpResponse
def index(request):                        #主页面发送请求

    return render(request,'index.html')

def ajax1(request):                         #接收ajax提交的数据
    print(request.POST)                     #接收到:<QueryDict: {'xixi': ['123']}>
    return HttpResponse('...')

Ajax
<script>
      functionAjaxSubmit2() {                              {#Query_Ajax发送GET请求#}
            $.ajax({
                url: '/ajax1.html',                              {#传给ajax1.html#}
                type:'POST',                                     {#POST方式#}
                data: {'xixi':123},                              {#传输数据#}
                success:function (arg) {
                }
            })
      }
    </script>

很简单基础的东西 结合自己的写吧

thepoy 发表于 2020-7-26 18:43

从你的终端信息来看,你ajax发送的是POST,但django收到的是GET,应该是这里的问题吧。排版弄好一点,才有人回你。

西方记者 发表于 2020-7-27 21:05

不忘初心哟 发表于 2020-7-25 17:06
Url:
from django.conf.urls import url
from django.contrib import admin


十分感谢!!!{:1_893:}

西方记者 发表于 2020-7-27 21:06

thepoy 发表于 2020-7-26 18:43
从你的终端信息来看,你ajax发送的是POST,但django收到的是GET,应该是这里的问题吧。排版弄好一点,才有 ...

谢谢建议,下次发帖一定注意{:1_896:}

thepoy 发表于 2020-7-27 23:27

西方记者 发表于 2020-7-27 21:06
谢谢建议,下次发帖一定注意

问题解决了吗?

thepoy 发表于 2020-7-27 23:38

本帖最后由 thepoy 于 2020-7-27 23:40 编辑

你的视图函数里应该对不同的方法进行区分,比较好的是用类视图,拿一个我之前写的例子给你参考一下:
```python
# 这是一个模拟用户登录的类视图
class LoginView(View):
    # 前端调用get时,类视图也调用get
    def get(self, request):
      return render(request, 'user/login.html')
                        
    # 前端调用post时,类视图也调用post,函数体内你可以写具体要实现的方法
    def post(self, request):
      login_form = UserLoginForm(request.POST)
      if login_form.is_valid():
            email = login_form.cleaned_data['email']
            password = login_form.cleaned_data['password']

            user = authenticate(username=email, password=password)
            if user:
                if user.is_start:
                  login(request, user)
                  url = request.COOKIES.get('url', '/')
                  response = redirect(url)
                  response.delete_cookie('url')
                  # return redirect(url).delete_cookie('url')
                  return response
                else:
                  return HttpResponse('请点击邮件中的激活链接激活账号')
            else:
                return render(request, 'user/login.html', {'err': '邮箱或密码错误'})
      else:
            return render(request, 'user/login.html', context={'register_form': login_form})
```

你既然用ajax,我觉得你的使用环境可能是前后端分离,所以如果你用的是restfu的话,可以参考:
```python
class UsersAPIView(CreateAPIView):
    serializer_class = UserSerializer
    queryset = UserModel.objects.all()

    def post(self, request, *args, **kwargs):
      # action 是url中的参数
      action = request.query_params.get('action')
      if action == 'login':
            name = request.data.get('name')
            password = request.data.get('password')
            try:
                user = UserModel.objects.get(name=name)
                if user.password != password:
                  raise exceptions.AuthenticationFailed
                token = uuid.uuid4().hex
                cache.set(token, user.id, timeout=60 * 60 * 24)
                data = {
                  'status': 200,
                  'msg': '登录成功',
                  'token': token
                }
                return Response(data)
            except UserModel.DoesNotExist:
                raise exceptions.NotFound
      elif action == 'register':
            return self.create(request, *args, **kwargs)
      else:
            raise exceptions.ParseError
```

西方记者 发表于 2020-7-28 11:27

thepoy 发表于 2020-7-27 23:38
你的视图函数里应该对不同的方法进行区分,比较好的是用类视图,拿一个我之前写的例子给你参考一下:
...

是的,类视图检查起来很方便;之前的问题应该是出在请求方式和url上,已经解决了,感谢!{:1_893:}
页: [1]
查看完整版本: AJAX异步请求Django数据