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()

python自动开发之(ajax)第二十天的更多相关文章

  1. python自动开发之第二十一天

    一.请求周期 url> 路由 > 函数或类 > 返回字符串或者模板语言? 1.Form表单提交: 提交 -> url > 函数或类中的方法 - .... HttpResp ...

  2. python自动开发之第十三天

    1.Paramiko模块下的demo.py程序     前面利用Python中的Paramiko模块可以进行SSH的连接,以及用来传送文件(SFTP),但是无论是哪一种方式,连接都是短暂的,并非是长连 ...

  3. python自动开发之第二十五天

    一.组合搜索 参考: http://www.cnblogs.com/ccorz/p/5985205.html 二.JSONP 1.在同源策略下,在某个服务器下的页面是无法获取到该服务器以外的数据的,但 ...

  4. python自动开发之第二十四天(Django)

    一.ModelForm操作及验证 1.class Meta:class Meta: #注意以下字段不能加逗号 model = models.UserInfo #这里的all代指所用的字段,也可以是一个 ...

  5. python自动开发之第二十二天

    知识点概要 - Session - CSRF - Model操作 - Form验证(ModelForm) - 中间件 - 缓存 - 信号 一. Session 基于Cookie做用户验证时:敏感信息不 ...

  6. python自动开发之第十八天

    一.JS正则 test - 判断字符串是否符合规定的正则 rep = /\d+/; rep.test("asdfoiklfasdf89asdfasdf") # true rep = ...

  7. python测试开发django-51.Ajax发送post请求登录案例

    前言 我想实现一个登录功能:登录的接口是另外一个地方提供,页面上点登录按钮的时候,先访问登录接口,根据接口返回json信息判断是否登录成功,登录成功页面跳转,登录不成功,在登录首页显示失败原因 登录页 ...

  8. python自动开发之第二十三天(Django)

    一.一大波model操作 1. 创建数据库表 # 单表 # app01_user ==> tb1 # users class User(models.Model): name = models. ...

  9. python自动开发之第十二天

    一.数据库的介绍 (1)由多张表组成(2)存取有规则,数据有关联(3)数据量大,被优化 好处:更有效的存取数据 二.关系型数据库管理系统(RDBMS) Oracle,Mysql,Sqlserver,D ...

随机推荐

  1. Self-numbers 2 - SGU 108

    翻译:引自 http://www.cnblogs.com/yylogo/archive/2011/06/09/SGU-108.html 在1949年印度的数学假D.R. Kaprekar发现了一种叫做 ...

  2. zoj 1671 Walking Ant【简单bfs】

    Walking Ant Time Limit: 2 Seconds      Memory Limit: 65536 KB Ants are quite diligent. They sometime ...

  3. CSS3新特性(阴影、动画、渐变、变形、伪元素等)

    CSS3与页面布局学习总结(六)--CSS3新特性(阴影.动画.渐变.变形.伪元素等)   目录 一.阴影 1.1.文字阴影 1.2.盒子阴影 二.背景 2.1.背景图像尺寸 2.2.背景图像显示的原 ...

  4. bzoj4447 SCOI2015 小凸解密码 password

    传送门:bzoj4447 题解: 调试简直恶心,不过调完发现其实还是挺好写的. 用\(\mathrm{set}\)维护一段\(0\)区间的左右端点,每次最多修改两个点,所以很好维护. 查询的时候在\( ...

  5. IOS 多个ImageView图片层叠透明区域点击事件穿透

    经常用到多个透明图片层叠,但又需要获取不同图片的点击事件,本文实现图片透明区域穿透点击事件 实现人体各个部位点击 - (BOOL) pointInside:(CGPoint)point withEve ...

  6. MediaInfo源代码分析 4:Inform()函数

    我们来看一下MediaInfo中的Inform()函数的内部调用过程 首先Inform()函数封装了MediaInfo_Internal类中的Inform()函数 //返回文件信息 String Me ...

  7. 如何将ER图转换成关系模式集

    在ER图中,主要是实体类型和联系类型. 1.实体类型的转换 (“——”表示对应关系) 实体类型——关系模式 实体的属性——关系模式的属性 实体标识符——关系模式的键 2.联系的转换 一元联系较简单,三 ...

  8. [RxJS + AngularJS] Sync Requests with RxJS and Angular

    When you implement a search bar, the user can make several different queries in a row. With a Promis ...

  9. iOS开发中关于UIImage的知识点总结

    UIImage是iOS中层级比较高的一个用来加载和绘制图像的一个类,更底层的类还有 CGImage,以及iOS5.0以后新增加的CIImage.今天我们主要聊一聊UIImage的三个属性: image ...

  10. ARCGIS二维三维平移

    private void glZoomPan() { ESRI.ArcGIS.SystemUI.ICommand com = new ControlsGlobePanTool(); com.OnCre ...