首页 文章 精选 留言 我的

精选列表

搜索[前后端架构],共10012篇文章
优秀的个人博客,低调大师

apijson-framework 6.0.1 发布,腾讯 APIJSON 后端框架

apijson-framework 5.4.0-6.0.1 更新内容 新增支持全能接口 /crud,一个请求 JSON 同时使用多种 CRUD 操作,感谢@cloudAndMonkey的贡献#15; 新增支持假删除,感谢@cloudAndMonkey的贡献#16; 新增支持 Lua 等各种脚本语言,感谢@cloudAndMonkey的贡献#17; 远程函数新增支持 JavaScript 脚本,方便动态配置业务逻辑以及作为 Serveless 服务; @raw 新增支持远程函数和存储过程; 升级 APIJSON 和自身版本至 6.0.0; 具体见Release 发布版本。 apijson-framework 腾讯APIJSON服务端框架,通过数据库表配置角色权限、参数校验等,简化使用。 使用 Access:https://gitee.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/MethodAccess.java Request:https://gitee.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/Operation.java 使用 UnitAuto 实现零代码单元测试,具体见 https://gitee.com/TommyLemon/UnitAuto https://gitee.com/APIJSON/apijson-framework 创作不易,右上角点 ⭐Star 支持下吧 ^_^

优秀的个人博客,低调大师

Django前后端分离实践之DRF--03

一、序列化 1. 创建表 以出版社的表为例子,例如出版社有名字和所属地区 选区_051 class Publisher(models.Model): name = models.CharField(max_length=32, verbose_name='名称', unique=True) address = models.CharField(max_length=128, verbose_name='地址') def __str__(self): return self.name class Meta: verbose_name = '出版社' verbose_name_plural = verbose_name 选区_162 2. 生成迁移文件和执行迁移 在这里我们暂时用sqlite数据库 python manage.py makemigrations python manage.py migrate 3. 什么是序列化 维基百科资料关于序列化的介绍 3.1 关于序列化的解释: 在程序运行的过程中,所有的变量都是在内存中,比如,定义一个dict: d = dict(name='Zhangsan', age=26, score=75) 可以随时修改变量,比如把name改成'LiSi',但是一旦程序结束,变量所占用的内存就被操作系统全部回收。如果没有把修改后的'LiSi'存储到磁盘上,下次重新运行程序,变量又被初始化为'Zhangsan'。 <b style='color:red'>我们把变量从内存中变成可存储或传输的过程称之为序列化</b>,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思。 序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。 反过来,<b style='color:red'>把变量内容从序列化的对象重新读到内存里称之为反序列化</b>,即unpickling。 3.2 JSON <b style='color:red'>如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式</b>,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便。 JSON表示的对象就是标准的JavaScript语言的对象,JSON和Python内置的数据类型对应如下: JSON类型 Python类型 {} dict [] list "string" str 1234.56 int或float true/false True/False null None Python内置的json模块提供了非常完善的Python对象到JSON格式的转换: 3.3 把Python对象变成一个JSON: import json d = dict(name='Zhangsan', age=26, score=75) # dumps()方法返回一个str,内容就是标准的JSON json_str= json.dumps(d) 3.4 要把JSON反序列化为Python对象,用loads()方法: json_str = '{"age": 26, "score": 75, "name": "Zhangsan"}' json.loads(json_str) 4. 通过以下方式可以实现API: 编写视图: from .models import Publisher from django.http import HttpResponse def publisher_list(request): # 查询出所有的出版社 queryset = Publisher.objects.all() # 转换成python中的列表 data = [] for i in queryset: # 每一个对象都手动转化成一个字典 p_tmp = { 'name': i.name, 'address': i.address } data.append(p_tmp) import json return HttpResponse(json.dumps(data), content_type='application/json') 选区_163 配置路由: url(r'^publishers/', views.publisher_list) 启动项目 python manage.py runserver 选区_164 手动添加数据 选区_165 刷新浏览器 选区_166 选区_167 5. 对于以上的方案进行第一次改进: data = [] from django.forms.models import model_to_dict for i in queryset: data.append(model_to_dict(i)) 注意:这种方式有缺陷,很多字段无法转换成字典,比如图片 选区_168 6. 对于以上的方案进行第二次改进(使用Django自带的serializers): data = [] from django.core import serializers data = serializers.serialize('json', queryset) import json return HttpResponse(data, content_type='application/json') 注意:此时data已经是json类型 选区_169 刷新浏览器 选区_170 二、DRF提供的序列化 DRF提供的方案更加先进,更高级别的序列化方案,不仅仅可以实现从数据库里面读取数据,更可以存数据(增删改查) 1. 在APP下创建一个序列化一个文件 我们自己定义一个序列化 from rest_framework import serializers # 类名固定为表名称 + Serializer class PublisherSerializer(serializers.Serializer): # read_only必须为True,因为我们模型里面的id是一个自增字段,不可写,自动生成 id = serializers.IntegerField(read_only=True) name = serializers.CharField(max_length=32) address = serializers.CharField(max_length=128) 选区_171 2. 使用自己定义的序列化 非常方便的把我们的对象转化成一个字典 from app01 import models,serializers p1 = models.Publisher.objects.first()# 先找到一个出版社的对象 s = serializers.PublisherSerializer(p1) s.data 选区_172 3. 给自定义的序列化增加一个'create'和'update'的功能 重写父类 def create(self, validated_data): # validated_data参数不需要特意去记,就是经过校验的数据 return models.Publisher.objects.create(**validated_data) def update(self, instance, validated_data): instance.name = validated_data.get('name', instance.name) instance.address = validated_data.get('address', instance.address) instance.save() return instance 使用 from app01 import models,serializers p2 = {'name':'图灵出版社','address':'大兴天宫院'} s = serializers.PublisherSerializer(data=p2) s.is_valid()# 如果数据检测没有问题 Out[5]: True s.validated_data # 可以查看类型,观察到这是一个有序字典 Out[6]: OrderedDict([('name', '图灵出版社'), ('address', '大兴天宫院')]) s.save() # 保存到数据库 Out[7]: <Publisher: 图灵出版社> 选区_173 刷新浏览器 选区_174 在视图里面使用 # 第三次改进 from app01 import serializers # 如果是多个对象,一定要写many = True,就是说我们是多个对象, # many=True告诉程序要用遍历的方式去给我们做序列化 s = serializers.PublisherSerializer(queryset, many=True) import json return HttpResponse(json.dumps(s.data), content_type='application/json') 选区_175 4. 改进自定义序列化模块 因为那些字段,我们已经在模型中创建,没有必要再创建一次,所以我们再进行一次改进 class PublisherSerializer(serializers.ModelSerializer): class Meta: model = models.Publisher # 我们要使用的模型 # 我们要使用的字段 fields = ( 'id', 'name', 'address' ) 选区_176 刷新浏览器,依旧可以正常运行,也就说是我们可以自己去写每一个字段,当然可以用ModelSerializer,直接使用我们的模型(相当于和我们数据库里面的表字段一一对应) 选区_177

优秀的个人博客,低调大师

使用IntelliJ IDEA新建Java Web后端resfulAPI模板

初始化项目 打开IntelliJ IDEA,我的版本是Version 2018.1.4。点击Create New Project。在左侧的列表中选择Maven。然后在右侧勾选Create from archetype。 然后在右侧的列表中选择org.apache.maven.archetypes:maven-archetype-webapp。点击next。 填写GroupId和ArtifactId。GroupId定义了项目属于哪个组织,例如,我们需要使用一个包,名字叫做fastjson,用户在项目中返回json数据的,是阿里的开源框架,被不少企业使用,是一个极其优秀的Json框架。它的groupId是com.alibaba,artifactId是fastjson。 简单理解一下,拿Github举个例子。GroupId就相当于是你的用户名,而ArtifactId就相当于是你的具体某个项目的名称,也是我们当前的项目的根目录名称。例子如下。 GroupId: com.detectivehlh.test ArtifactId: testDemo 点击next,下两页不用设置,直接点击next。此时新建项目成功,右下角会弹出一个提示框,上面写着Maven projects need to be imported.此时选择Enable Auto-Import。就可以看到项目开始自动的去加载依赖包了。加载完成之后,项目会多出一个src目录。 引入jersey和servlet 打开根目录下pom.xml文件,在dependencies标签中添加如下代码,引入servlet。 <dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-servlet</artifactId> <version>2.22.2</version> </dependency> 打开/src/main/webapp/WEB_INF/web.xml。在web-app标签之间添加如下代码。 <servlet> <servlet-name>JAX-RS Servlet</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <init-param> <param-name>jersey.config.server.provider.packages</param-name> <param-value>com.detectivehlh.test</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>JAX-RS Servlet</servlet-name> <url-pattern>/api/*</url-pattern> </servlet-mapping> 新建项目目录和文件 在/src/main目录下新建java、resources目录,java放项目java源代码,resources放项目的静态资源文件。 打开File中的Project Structure,或者使用快捷键,command + ;就可以快捷打开了。将刚刚创建的名为java目录设置为Sources,resources设置为Resources。然后Apply。然后在java目录下依次新建com.detectivehlh.test三个包,就是我们的GroupId. 然后在com.detectivehlh.test中新建Hello类。代码如下。 package com.detectivehlh.test; import com.alibaba.fastjson.JSONObject; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.util.ArrayList; import java.util.List; @Path("/hello") public class Hello { @Path("get") @GET @Produces(MediaType.APPLICATION_JSON) public Response getStudent() { List<Student> lists = new ArrayList<Student>(); lists.add(new Student("1","mayun",23)); lists.add(new Student("2","mahuateng",24)); lists.add(new Student("3","zhouhongyi",25)); JSONObject json = new JSONObject(); return Response.status(Response.Status.OK).entity(json.toJSONString(lists)).build(); } } 同样的地方新建Student类。代码如下。 package com.detectivehlh.test; public class Student { private String id; private String name; private int age; public Student(String id, String name, int age) { this.id = id; this.name = name; this.age = age; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } 引入fastjson 这个时候可以看到,Hello的class中有报错。是因为没有在pom.xml中没有引入对fastjson的依赖。在根目录下的pom.xml中添加如下依赖。 <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.21</version> </dependency> 再回到Hello中就可以看到没有错误信息了。 配置Tomcat 选择顶部菜单栏中的Run->Edit Configurations。点击左侧的+,选择Tomcat Server->local。配置好Tomcat后,选择Server旁边的Deployment标签,点击下方的+,选择Artifact,选择testDemo:war exploded。点击Apply。然后点击右上角的长得像播放键的按钮,启动项目。 就可以看到会新建一个浏览器标签页。显示"Hello World!",然后改变浏览器中的路由为我们写的接口的路由,/api/hello/get。就可以看到返回的json数据了。

优秀的个人博客,低调大师

前端jsp与后端servlet传值(java web)

jsp中js使用jQuery封装好的 $.ajax()方法与服务器进行交互 var jsonStick = this.strtoJson(); $.ajax({ type : 'post',//不起作用 要用jsonP url : 'controllerServlet',//要传输数据对象的地址 contentType : "application/x-www-form-urlencoded",//转化为form表单传值 data : { "js" : jsonStick }, //前面的js是服务端获取的ID 后面的jsonStick是处理后的json对象 cache : false, dataType : 'text',//这个关系到你能不能正确接收到servlet 响应的数据 async : false, //因为ajax默认是异步调用的,所以得到的返回值是空值,要得到值必须改成同步:async: false success : function(data) { //console.log(data); flag = data; //采用全局变量flag接收数据(data未作处理) }, error : function(msg) { //ajax请求失败后触发的方法 //弹出错误信息 console.log(msg); } }); //数据处理函数 function() { //'':this.note.name, var arr = []; var json = {}; json.note_id = this.id json.note = this.text; json.left = this.left; json.top = this.top; json.zindex = this.zIndex; if (this.sqlId == null) { this.sqlId = 0; } json.sqlId = this.sqlId; arr.push(json); var jsonStick = JSON.stringify(arr);//格式化json数据 return jsonStick; } servlet接收 处理 响应 protected void doGet(.........){ String js = request.getParameter("js");//接收jsp传过来的数据 JSONArray json = JSONArray.fromObject(js);//对数据进行数组转化 JSONObject jsonOne = json.getJSONObject(0);//获取确定的json对象 boolean flag = true; PrintWriter out = response.getWriter(); out.print(flag);//将flag传给jsp out.close(); } jsp接收响应 并对数据进行处理 $.ajax({ type : 'post', url : 'sendServlet', cache : false, dataType : 'json', async : false, //因为ajax默认是异步调用的,所以得到的返回值是空值,要得到值必须改成同步:async: false success : function(data) { //console.log(data.result.note) for (var i in data) { console.log(data[i]) note = new Note(); note.id = data[i].note_id; note.text = data[i].note; note.timestamp = new Date().getTime(); note.left = data[i].left; note.top = data[i].top; note.zIndex = data[i].zindex; } }, error : function(msg) { //ajax请求失败后触发的方法 //弹出错误信息 console.log(msg); } }); 中间用到的jar包以及js https://pan.baidu.com/s/1XEOkM1as_10I92WAzooBuA 密码:gix8

优秀的个人博客,低调大师

Python后端(一)——客户端/服务端

网址组成(四部分) 协议 http, https(https 是加密的http) 主机 g.cn zhihu.com之类的网址 端口 HTTP 协议默认是 80,因此一般不用填写 路径 下面的「/」和「/question/31838184」都是路径 http://www.zhihu.com/ http://www.zhihu.com/question/31838184 电脑通信靠IP地址,IP地址记不住就发明了域名(domain name),然后电脑自动向DNS服务器(domain name server)查询域名对应的IP地址 比如g.cn这样的网址,可以通过电脑的ping程序查出对应IP 地址 ping g.cn PING g.cn (74.125.69.160): 56 data bytes 端口是什么? 一个比喻: 用邮局互相写信的时候,ip相当于地址(也可以看做邮编,地址是域名) 端口是收信人姓名(因为一个地址比如公司、家只有一个地址,但是却可能有很多收信人) 端口就是一个标记收信人的数字。 端口是一个16 位的数字,所以范围是 0-65535(2**16) ——HTTP协议—— 一个传输协议,协议就是双方都遵守的规范。 为什么叫超文本传输协议呢,因为收发的是文本信息。 1,浏览器(客户端)按照规定的格式发送文本数据(请求)到服务器 2,服务器解析请求,按照规定的格式返回文本数据到浏览器 3,浏览器解析得到的数据,并做相应处理 请求和返回是一样的数据格式,分为4部分: 1,请求行或者响应行 2,Header(请求的 Header 中 Host 字段是必须的,其他都是可选) 3,\r\n\r\n(连续两个换行回车符,用来分隔Header和Body) 4,Body(可选) 请求的格式,注意大小写(这是一个不包含Body的请求): 原始数据如下 'GET / HTTP/1.1\r\nhost:g.cn\r\n\r\n' 打印出来如下 GET / HTTP/1.1 Host: g.cn 其中 1,GET 是请求方法(还有POST等,这就是个标志字符串而已) 2,/ 是请求的路径(这代表根路径) 3,HTTP/1.1 中,1.1是版本号,通用了20年 具体字符串是'GET / HTTP/1.1\r\nhost:g.cn\r\n\r\n' 返回的数据如下 HTTP/1.1 301 Moved Permanently Alternate-Protocol: 80:quic,p=0,80:quic,p=0 Cache-Control: private, max-age=2592000 Content-Length: 218 Content-Type: text/html; charset=UTF-8 Date: Tue, 07 Jul 2015 02:57:59 GMT Expires: Tue, 07 Jul 2015 02:57:59 GMT Location: http://www.google.cn/ Server: gws X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1; mode=block Body部分太长,先不贴了 其中响应行(第一行): 1,HTTP/1.1 是版本 2,301 是「状态码」,参见文末链接 3,Moved Permanently 是状态码的描述 浏览器会自己解析Header部分,然后将Body显示成网页 ——web服务器做什么—— 主要就是解析请求,发送相应的数据给客户端。 例如附件中的代码(1client.py)就是模拟浏览器发送HTTP 请求给服务器并把收到的所有信息打印出来(使用的是最底层的 socket,现阶段不必关心这种低层,web开发是上层开发) // 客户端代码实例: 1 # coding: utf-8 2 3 import socket 4 5 6 # socket 是操作系统用来进行网络通信的底层方案 7 # 简而言之, 就是发送 / 接收数据 8 9 # 创建一个 socket 对象 10 # 参数 socket.AF_INET 表示是 ipv4 协议 11 # 参数 socket.SOCK_STREAM 表示是 tcp 协议 12 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 13 # 这两个其实是默认值, 所以你可以不写, 如下 14 # s = socket.socket() 15 # s = ssl.wrap_socket(socket.socket()) 16 17 # 主机(域名或者ip)和端口 18 host = 'g.cn' 19 port = 80 20 # 用 connect 函数连接上主机, 参数是一个 tuple 21 s.connect((host, port)) 22 23 # 连接上后, 可以通过这个函数得到本机的 ip 和端口 24 ip, port = s.getsockname() 25 print('本机 ip 和 port {} {}'.format(ip, port)) 26 27 # 构造一个 HTTP 请求 28 http_request = 'GET / HTTP/1.1\r\nhost:{}\r\n\r\n'.format(host) 29 # 发送 HTTP 请求给服务器 30 # send 函数只接受 bytes 作为参数 31 # str.encode 把 str 转换为 bytes, 编码是 utf-8 32 request = http_request.encode('utf-8') 33 print('请求', request) 34 s.send(request) 35 36 # 接受服务器的响应数据 37 # 参数是长度, 这里为 1023 字节 38 # 所以这里如果服务器返回的数据中超过 1023 的部分你就得不到了 39 response = s.recv(1023) 40 41 # 输出响应的数据, bytes 类型 42 print('响应', response) 43 # 转成 str 再输出 44 print('响应的 str 格式', response.decode('utf-8')) // 服务端代码实例 1 import socket 2 3 4 # 这个程序就是一个套路程序, 套路程序没必要思考为什么会是这样 5 # 记住套路, 能用, 就够了 6 # 运行这个程序后, 浏览器打开 localhost:2000 就能访问了 7 # 8 # 服务器的 host 为空字符串, 表示接受任意 ip 地址的连接 9 # post 是端口, 这里设置为 2000, 随便选的一个数字 10 host = '' 11 port = 2000 12 13 # s 是一个 socket 实例 14 s = socket.socket() 15 # s.bind 用于绑定 16 # 注意 bind 函数的参数是一个 tuple 17 s.bind((host, port)) 18 19 20 # 用一个无限循环来处理请求 21 while True: 22 # 套路, 先要 s.listen 开始监听 23 # 注意 参数 5 的含义不必关心 24 s.listen(5) 25 # 当有客户端过来连接的时候, s.accept 函数就会返回 2 个值 26 # 分别是 连接 和 客户端 ip 地址 27 connection, address = s.accept() 28 29 # recv 可以接收客户端发送过来的数据 30 # 参数是要接收的字节数 31 # 返回值是一个 bytes 类型 32 request = connection.recv(1024) 33 34 # bytes 类型调用 decode('utf-8') 来转成一个字符串(str) 35 print('ip and request, {}\n{}'.format(address, request.decode('utf-8'))) 36 37 # b'' 表示这是一个 bytes 对象 38 response = b'<h1>Hello World!</h1>' 39 # 用 sendall 发送给客户端 40 connection.sendall(response) 41 # 发送完毕后, 关闭本次连接 42 connection.close()

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册