工具是Python3.6+Django2.0,最新版本真的很令人头疼,经常有插件不能用。
先说说我对Django做小程序的与Django普通项目感到有些不同的地方。
一、数据转换为json;
二、使用小程序的登录验证;
三、富文本在小程序中的使用。
这几点就是导致我头疼的所有点了。
其实还有一个,因为后台居然被嫌弃简陋,所以去搞了一个xadmin的模板,然而人家不兼容2.0,折腾了半天才弄好。
首先讲一下json的转换,这个使我头疼是因为原来做的项目并没有一定要使用json,我嫌烦就一直没用过,这回才使我无比痛苦。
转换json我使用的是两个框架并合起来:
pip install django-simple-serializer
pip install django-rest-framwork
使用:
from dss.Serializer import serializer
from rest_framework.views import APIView
def response_as_json(data, foreign_penetrate=False): jsonString = serializer(data=data, output_type="json", foreign=foreign_penetrate, datetime_format='string', many=True) response = HttpResponse( # json.dumps(dataa, cls=MyEncoder), jsonString, content_type="application/json", ) response["Access-Control-Allow-Origin"] = "*" return response def json_response(data, code=200, foreign_penetrate=False, **kwargs): data = { "code": code, "msg": "成功", "data": data, } return response_as_json(data, foreign_penetrate=foreign_penetrate) def json_error(error_string="", code=500, **kwargs): data = { "code": code, "msg": error_string, "data": {} } data.update(kwargs) return response_as_json(data) JsonResponse = json_response JsonError = json_error
这是前提,之后对于项目中的使用为:
class NewsList(APIView): def get(self, request, *args, **kwargs): news = News.objects.values('id', 'title', 'img') #使用了分页 limit = 5 paginor = paginator.Paginator(news, limit) page = request.GET.get('page', 1) item_info = paginor.page(page) data = { 'news': item_info } return JsonResponse(data)
#urls.py
path('news', views.NewsList.as_view()),
顺带把小程序的代码也放上:
//http.js
var HOST_ROOT = "https://localhost/api/";
function generateUrl(url) {
var timestamp = new Date().getTime().toString().substring(0, 10);
var sign = generateSign(timestamp);
return HOST_ROOT + url;
};
#news.js
var http = require("../../utils/http.js");
getNews: function () {
var url = http.generateUrl('news?page='+page);
var content = this;
wx.showLoading();
wx.request({
url: url,
method: 'GET',
success: function (res) {
//success
wx.hideLoading();
if (res.statusCode == 200) {
content.setData({
newslist:content.data.newslist.concat(res.data.data.news),
});
page++;
} else {
wx.hideLoading();
content.setData({
addmore: "到底了"
});
}
},
})
},
以上。