模版用的还是比较多的,企业不可能全部做前后端分离,html标签和服务器端代码混写,应该把数据准备好,让模版做更少的操作。没必要过滤器来炫技,要什么数据准备什么数据即可,尽量少做操作
第一步先应该在settings里将模版的搜索目录填好
下面要把项目运行起来,让他能够做url映射,必须配置路由文件,一开始我们配的是blog下的,urls,全局的
每个请求应该单独调用对应的handler,不可能混用,每个请求送到函数里去,各自压自己的栈,互不影响。
现在准备对testlist进行遍历
需要奇偶行,模版做好后,就遍历里面的所有元素,将这个元素该打印打印,ul放在外面,迭代里面的li即可。forloop是行号
行号就不要加reverse了,往往都是从1开始
刷新一下F5
现在已经满足了对行号的要求,然后所有数据需要+100
现在+100,需要过滤器来完成
为了避免问题,还是加上引号
要求奇偶颜色不同
现在奇偶的效果是出来了
就一点不一样,试试使用三元表达式
就是yes or no的问题,其实就是说的三元表达式
能整除就是event,不能就是odd。先整除,后判断
现在有了这个基础,开始考虑颜色,这部分提取出来考虑颜色的问题
在模版渲染的时候不关心标签,只关心要替换的位置
所以是先用渲染函数,把我们的数据处理完,处理完之后拼接到字符串里填的空,只不过这个空是循环填,循环完了以后,字符串最后变成了一个url里面套很多li
服务器这端,玩的就是字符串替换,替换完生成的正文字符串,发回浏览器端,浏览器看到MIME类型是什么类型,如html就按照html解析,渲染,构造DOM树。
所有动态语言都这样,只要出现这种语法都会将这些内容在服务器端做替换,如果是循环就循环替换,替换完了,会生成一个文本。这个文本被http封装成http报文返回到浏览器端,由浏览器负责解释渲染
这一块是把它先替换,替换完了就变成大字符串里面,这个表达式最后通过管道,要么输出red,要么blue,把red拼到color:后面
现在就搞定了
这就是输出的结果
也可以通过奇偶行的样式不同来改变颜色
打印99乘法表需要用表格
日常方式输出,要么是上面的方式,要么是table,就这两种,一般企业不会用react,就用模版
用户功能设计与实现
用户是否激活,有个active字段,改成1/0,int,一般字段设计用char,varchar,int,tinint 一个字节,int4个字节,bigint8个字节。
有时候datetime用一下
有了user之后,就要围绕user表做一些功能,方法加url结合在一起就是restful风格,前后端分离都需要,
需要两个东西,方法和url,查询字符串基本不用,如果要把数据推送上去就要采用post,注册的时候需要推送emil,用户名 ,密码
POST现在不采用传统的表单提交了,准备使用前端的ajax,做完前端依然会有界面,依然表单控件,提交数据但是不是用form表单的post了,会转换成json,用js转换成json,用json的方式,和后台进行交互
B端会发送AJAX请求,用异步的方式提交请求,之前是用postman构造数据发送请求给server,server其实不关心你用的是浏览器还是不是浏览器,只关心发的请求对不对,postman是个工具浏览器
后端用postman这种工具浏览器来测试我们开发的功能
前端假定要访问谁,访问一个server但是没有开发好,就会有一个模拟的server,测试server ,ms,写好的数据返回给前端,这样前端后端各自开发各自的,完全分离
前端直接和MS进行通信,假数据拿到了,可以用react把数据填充起来
前后端分离,就要中间传无格式数据(格式就需要前端人员开发,纯粹html,+css+js写的框架,需要发起一个个url的http请求,请求到后端,由server去查数据回来,将数据直接返回给前端,前端只要把数据拿到,用nodejs填充到表格里就行)
先要是吧数据和模版混成一个大字符串返回给客户端的,这是两套开发方式
现在要把耦合降到最低,就没有模版了,中间就需要定义json格式
restful是定义数据接口传输的风格,用的三种传输方式的第三种,第一种get,第二种post,第三种是url也带着信息。
url的信息+方法,组合起来就是restful风格
项目管理上建议每个项目都形成一个接口文档,不管是不是敏捷开发
整个过程采用异步的过程,浏览器用ajax发送异步的请求,然后提交json数据,处理完之后,返回json数据过去,整个过程中间,数据不带格式
SPA是单页面,一套模版可以弄完,只不过一套模版有单调,模版需要在前端做,不需要再后端做,前后端分离就不需要在后端做了
接口已经设计好了,注册调用跟下d /user/reg,采用POST方式,提交JSON格式。现在restful风格必须定义这种格式,传的什么url,什么方式,什么参数,没个参数什么意思,都要规定下来
现在restful风格必须定义这种格式,传的什么url,什么方式,什么参数,没个参数什么意思,都要规定下来
现在做路由配置,用render就需要模版,但是这里不要render,这里采用前后端分离,就不需要提供模版
就找django和http相关的,纯json即可
现在只是做了view
如何访问,还需要配置urls,定义好views视图,如果让用户看到还需要配置url路由
现在返回的response就是json,10个字符长度
但是这个urls是全局的,如果有100多个路由,那么这个url里的partterns就会有很多,就不太好
在应用user里,创建一个urls.py
之前settings配置的入口是blog.urls,这样就不认识应用下的urls了
实际上可以用include
配置文件里有include
试试现在映射关系写
应该写include
但是include不是这么用的
这里的意思是只要是user/开头的,都扔到user.urls里来
到user下的urls里,要求是以reg开头reg结尾,跟reg函数映射
路由配置的几项
只要匹配到user/开头的,都传给user.urls
user下的urls配置的是reg开头和结尾的,就跟reg函数映射起来,每次匹配进去,就把匹配到的剥掉了,只匹配剩余部分,这样就建立器一种多级的匹配。
现在就发现blog.urls下的文件是每个业务入口的匹配,每个业务的匹配应该交给每个业务的urls映射文件
试试这样能否使用
改一下views
这里就发生了变化,说明路径配置正确
用url来做模式匹配,当模式符合的时候可以跟函数,可以跟函数下的方法,我们自己也可以用include(包名.模块名),urls.py是模块,
user开头的,一旦匹配到,就把匹配的部分去掉了,剩下的跟这个指向的模块对应起来
相当于选中这部分已经去掉了
下面剩下匹配的就只有reg了,符合条件就可以调用reg函数了
必须写urlpatterns
选中部分必须写映射的列表
url来自哪里就来自哪里
与什么函数建立关系
两种方式,要么在这里建立映射,要么使用刚才的多级关系,开发中更常用多级的方式,否则全局的urls太多内容,每个应用都应该建立自己的urls映射关系
include写的应用就是包,项目根目录哪些user就是包
url函数,如果第二个不是可调用对象
如果不是可调用对象,可以是元组,可以是列表,include函数会返回一个三元组
所以url第二个参数里做了很多事情,做了很多判断
重要的是,不管接收什么参数,会将已经匹配到的部分摘除,送到下一级进行匹配
下面开始要解决视图的问题,现在reg函数要更加完善,要完成注册,提交数据完成解析,检查数据是否错误,最后将数据存储到数据库,告诉用户注册成功
在postman里去做,用json的方式完成提交数据
数据发送过去又posts了,还是应该先把settings里的中间件关掉,提交上来后,再解决跨站欺骗问题CSRF
要在请求body部分传输数据,用row的方式是最原始的。然后再选择json的方式就可以
现在就需要解决业务问题reg,现在打印出来空的信息
post是表单提交的方式,现在已经不玩这种方式了,现在是json,试试是不是is_ajax
再发送下数据
false,代表不用ajax方式,因为不是按这个方式提交的
这里第一个是来定位的,在页面里定位,就会定位到哪个py文件
看看request里有什么,选择点击定位
看看这里提供哪些方法,这里面是能够看到的方法,好像看不到跟头head相关的,有些就需要区基类看看
这里的body是一个属性,有read方法说明跟socket相关,从数据里读取出来
get和post拿到的内容塞到了里面去了,meat,path,method,最重要的几个都在了,meta就是header
一个request请求体里是会有body的,看一下这个body
拿到了一个bytes
这些信息通过客户端http协议发到了服务器端,服务器端通过映射映射到了函数中,在函数中拿到了最原始的header,body,然后将head和body通过wsgi的server替我们封装成了environ,将给了application,application就是django,django就是框架,将application得到的environ,重新封装到request对象中,这个request对象的类型是httprequest
安装一个simple json,json格式比较复杂就用simple json
现在拿到了数据,准备用simplejson,loads(request.body)
打印一下body里的东西
可以它发什么返回什么
是一个字典,有了字典下面就可以使用了
注册环节相当于insert,要把数据添加到数据库中,就要用到orm的语法,payload如果拿到的是空字典也会出错,所以用try,不能把错误raise出去,给客户端,因为raise了相当于当前线程崩溃了
应该return一个response对象,在http里看一下
http里有一大堆东西,notfound 404
父类是response
再看一下这个404
这是异常
父类response
response继承base。
base继承这个
继承自object,所以不是异常
不能用404,现在就用badrequest告诉请求是错误的
但是这么做是错的,这里不能使用raise,异常是要基于baseexception来的,这个现在不是从那里来的,404特殊是基于异常的
应该这么写
所有的东西打印一下看看,(用get就不会报错,中括号拿不到就会报错)
打印的是邮箱地址和用户名和密码
类似ORM工具,导入我们写的user类
在save的时候会做一次提交,可以打印一下问题
给用户看的要答非所问,不要暴露内部
raise直接往外抛,下面就可以捕获到,不用写两次
首先提取出body,约定好用json,如果拿不出来json就报错,特别用中括号,中括号拿不到就会出错
拿到这三项,填充对象,
填充好后调用save方法,如果提交成功就会自动commit
也可以这里抛出任何异常都归它管
这个return写哪里都可以
sqlalchemy的时候,当我们insert成功,会立即select将这个对象的ID填充好,内部肯定有维护状态,不然怎么知道提交成功与否,所有的orm都是这个样子
返回1
成功了
从这个简单例子,提取了非表单post提交的数据,能用的无非就是get,post,body,如果在url中有查询字符串,依然去get里找,在body里的,就去requestpost里去找
找到这个数据发现是个字符串,但这个字符串实际上是bytes,现在要用一个json的序列化库,这次用的是simplejson,会把这个bytes的json转换成一个字典,用这个字典提取数据插入到准备好的modle类构造的实例中,最后调用model类实例 的save方法,一旦提交会生成一个id
返回的错误要含糊,比如登录失败,一般告诉用户名或者密码错误