zoukankan      html  css  js  c++  java
  • python自动开发之(ajax)第二十天

    1、Django请求的生命周期

    路由系统 -> 试图函数(获取模板+数据=》渲染) -> 字符串返回给用户

    2、路由系统
    /index/ -> 函数或类.as_view()
    /detail/(d+) -> 函数(参数) 或 类.as_view()(参数)
    /detail/(?P<nid>d+) -> 函数(参数) 或 类.as_view()(参数)
    /detail/ -> include("app01.urls")
    /detail/ name='a1' -> include("app01.urls")
    - 视图中:reverse
    - 模板中:{% url "a1" %}

    3、视图
    FBV:函数
    def index(request,*args,**kwargs):
    ..

    CBV:类
    class Home(views.View):

    def get(self,reqeust,*args,**kwargs):
    ..

    (插入)HTTP协议请求的几种方式

    常用HTTP请求有GET和POST两种。
     
    GET
    对服务器资源的简单请求
     

    GET方法是默认的HTTP请求方法,我们日常用GET方法来提交表单数据,然而用GET方法提交的表单数据只经过了简单的编码,同时它将作为URL的一部分向Web服务器发送,因此,如果使用GET方法来提交表单数据就存在着安全隐患上。例如

    从上面的URL请求中,很容易就可以辩认出表单提交的内容。(?之后的内容)另外由于GET方法提交的数据是作为URL请求的一部分所以提交的数据量不能太大

    POST
    用于发送包含用户提交数据的请求

    POST方法是GET方法的一个替代方法,它主要是向Web服务器提交表单数据,尤其是大批量的数据。POST方法克服了GET方法的一些缺点。通过POST方法提交表单数据时,数据不是作为URL请求的一部分而是作为标准数据传送给Web服务器,这就克服了GET方法中的信息无法保密和数据量太小的缺点。因此,出于安全的考虑以及对用户隐私的尊重,通常表单提交时采用POST方法。

    从编程的角度来讲,如果用户通过GET方法提交数据,则数据存放在QUERY_STRING环境变量中,而POST方法提交的数据则可以从标准输入流中获取。

     
    除此之外还有
    HEAD
    类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
    PUT
    传说当前请求文档的一个版本
    DELETE
    发送一个用来删除指定文档的请求
    TRACE
    发送请求的一个副本,以跟踪其处理进程
    OPTIONS
    返回所有可用的方法;可检查服务器支持哪些方法
    CONNECT
    用于ssl隧道的基于代理的请求


    获取用户请求中的数据:
    request.POST.get
    request.GET.get
    reqeust.FILES.get()

    # checkbox,
    ........getlist()

    request.path_info


    文件对象 = reqeust.FILES.get()
    文件对象.name
    文件对象.size
    文件对象.chunks()

    # <form 特殊的设置></form>


    给用户返回数据:
      render(request, "模板的文件的路径", {'k1': [1,2,3,4],"k2": {'name': '张扬','age': 73}})
      redirect("URL")
      HttpResponse(字符串)


    4、模板语言

    render(request, "模板的文件的路径", {'obj': 1234, 'k1': [1,2,3,4],"k2": {'name': '张扬','age': 73}})

    <html>

    <body>
      <h1> {{ obj }} </h1>
      <h1> {{ k1.3 }} </h1>
      <h1> {{ k2.name }} </h1>
      {% for i in k1 %}
        <p> {{ i }} </p>
      {% endfor %}

      {% for row in k2.keys %}
        {{ row }}
      {% endfor %}

    {% for row in k2.values %}
    {{ row }}
    {% endfor %}

    {% for k,v in k2.items %}
    {{ k }} - {{v}}
    {% endfor %}

    </body>
    </html>

    5、ORM关系对象映射(Object Relational Mapping,简称ORM)


    a. 创建类和字段
    class User(models.Model):
    age = models.IntergerFiled()
    name = models.CharField(max_length=10)#字符长度

    Python manage.py makemigrations
    python manage.py migrate

    # settings.py 注册APP


    b. 操作
    models.User.objects.create(name='qianxiaohu',age=18)
    dic = {'name': 'xx', 'age': 19}
    models.User.objects.create(**dic)#注意这里的dic前要加**

    obj = models.User(name='qianxiaohu',age=18)
    obj.save()


    models.User.objects.filter(id=1).delete()

    models.User.objects.filter(id__gt=1).update(name='alex',age=84)
    dic = {'name': 'xx', 'age': 19}
    models.User.objects.filter(id__gt=1).update(**dic)

    models.User.objects.filter(id=1,name='root')
    models.User.objects.filter(id__gt=1,name='root')
    models.User.objects.filter(id__lt=1)
    models.User.objects.filter(id__gte=1)
    models.User.objects.filter(id__lte=1)

    models.User.objects.filter(id=1,name='root')
    dic = {'name': 'xx', 'age__gt': 19}
    models.User.objects.filter(**dic)

    # QuerySet ,内部元素都是对象
    v1 = models.Business.objects.all()
    # QuerySet ,内部元素都是字典
    v2 = models.Business.objects.all().values('id','caption')
    # QuerySet ,内部元素都是元组
    v3 = models.Business.objects.all().values_list('id','caption')

    # 获取到的一个对象,如果不存在就报错
    models.Business.objects.get(id=1)
    对象或者None = models.Business.objects.filter(id=1).first()


    外键:
    v = models.Host.objects.filter(nid__gt=0)
    v[0].b.caption ----> 通过.进行跨表


    外键:
    class UserType(models.Model):
    caption = models.CharField(max_length=32)
    id caption
    # 1,普通用户
    # 2,VIP用户
    # 3, 游客

    class User(models.Model):
    age = models.IntergerFiled()
    name = models.CharField(max_length=10)#字符长度
    # user_type_id = models.IntergerFiled() # 约束,
    user_type = models.ForeignKey("UserType",to_field='id') # 约束,

    name age user_type_id


    6、Ajax

    $.ajax({
      url: '/host',
      type: "POST",
      data: {'k1': 123,'k2': "root"},
      success: function(data){
        // data是服务器端返回的字符串
        var obj = JSON.parse(data);
        }
      })


    建议:永远让服务器端返回一个字典

    通过json把字典转换为类似字典的字符串返回
      return HttpResponse(json.dumps(字典))




    7、多对多:
    创建多对多:(建议两种都用,方式一能够创建多列,方式二只能创建三列)
    方式一:自定义关系表
    class Host(models.Model):
      nid = models.AutoField(primary_key=True)
      hostname = models.CharField(max_length=32,db_index=True)
      ip = models.GenericIPAddressField(protocol="ipv4",db_index=True)
      port = models.IntegerField()
      b = models.ForeignKey(to="Business", to_field='id')
    # 10
    class Application(models.Model):
      name = models.CharField(max_length=32)
    # 2

    class HostToApp(models.Model):
      hobj = models.ForeignKey(to='Host',to_field='nid')
      aobj = models.ForeignKey(to='Application',to_field='id')

    # HostToApp.objects.create(hobj_id=1,aobj_id=2)

    方式二:自动创建关系表
    class Host(models.Model):
      nid = models.AutoField(primary_key=True)
      hostname = models.CharField(max_length=32,db_index=True)
      ip = models.GenericIPAddressField(protocol="ipv4",db_index=True)
      port = models.IntegerField()
      b = models.ForeignKey(to="Business", to_field='id')
    # 10
    class Application(models.Model):
      name = models.CharField(max_length=32)
      r = models.ManyToManyField("Host")


    以下是内部自动创建的第三张表:

    无法直接对第三张表进行操作

    obj = models.Application.objects.get(id=1)
    obj.name

    # 第三张表操作(以下操作的前提Application的id=1)

    添加
    obj.r.add(1)  添加1,1
    obj.r.add(2)  添加1,2
    obj.r.add(2,3,4)  添加1,2   1,3   1,4
    obj.r.add(*[1,2,3,4]) 添加多个1,1   1,2   1,3   1,4

    删除
    obj.r.remove(1) 把1,1删除
    obj.r.remove(2,4)
    obj.r.remove(*[1,2,3])

    obj.r.clear() 所用application id=1 的删除

    更新
    obj.r.set([3,5,7]) 数据库只存在1,3  1,5  1,7 #注意这里不加*

    # 所有相关的主机对象“列表”  (不是真正的列表而是 QuerySet)
    obj.r.all()

  • 相关阅读:
    Angular2学习笔记一
    @valid注解
    JPA注解@GeneratedValue
    java8 lambda 表达式
    Lombok的使用
    mybatis-plus的集成与使用
    mybatis之Sql语句构建器
    mybatis之使用注解
    php学习----异常处理(接上篇)
    php学习----错误处理和代码重用
  • 原文地址:https://www.cnblogs.com/willpower-chen/p/6209638.html
Copyright © 2011-2022 走看看