目录:html
1:技术方面的收获前端
2:非技术层面的收获与离职python
3:一些零碎的知识点jquery
4:离职缘由nginx
5:感谢git
前言:ajax
刚毕业,在上海担路网工做了一个多月,从7.12号到8.20号。数据库
上海担路网主要产品是服务于中小企业,帮其定制发布PC网站,手机网站,微信公众号等等,算是一个互联网工具提供商。其主产品的主要技术构成是Django,Angular以及Tastypie。商家用户在其设置界面(非Django的admin)输入某项的对应数据(AngularJS)后(经过Angular的$Resource)接入到Tastypie的API从而操做Django的模型,经过Django的模板系统(用了很多Bootstrap的样式)将其展现在此商家的用户面前。还有个旁系产品是彻底的先后端分离的项目。django
一:技术方面的收获json
注:有些回顾可能因为时间缘由会遗忘或者出现一些问题
虽然写的是7.18的周任务,实际上是7.12,7.18两周写的,第一周第一天布置环境,第二三天熟悉产品与代码的对应,后面几天写的就没有提交。
写的上面主要都是一些改动,Angular与Django方面的
其中记录两个解决费时多一点的:
1)其中的"与"&“或”查询的实现:
首先会想到使用Django的Q search
通常使用以下:
Poll.objects.get( Q(question__startswith='Who'), Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)) )
而个人需求是从一个Hbase形数据中提取,因此是动态的传入一个dict而且实现或查询。我很傻得半天不知道如何去拼接,哎,只知道string的+拼接,其实抽象出来都是同样的,这里换成Q object的|拼接就完了。
search_conditions = Q()
for k,i in dict.items():
search_condition = search_condition | Q(k=i)
2) 查询改为POST提交
因为get提交的数据在url中会被服务器保存,因此在一些状况下改成post提交表单。
表单提交改成POST提交后的连带问题是分页,Django默认pagination是在url后经过/?page=n从而进入到get方法中,从而取出对应页的数据。这里的需求是将其改成post方法提交,可是依然是加入/?page=n到当前url,
也就是所在request.method=“POST”中依然从request.GET中获取page参数。
默认的使用以下:
{% if contacts.has_previous %} <a href="?page={{ contacts.previous_page_number }}">previous</a> {% endif %}
最后的解决办法是阻止翻页按钮的默认提交,将翻页按钮的href属性值加入到form的action中,而后点击提交form。这样的额外好处是还可以保持输入
大概代码以下
$("xxx").click(function(event){
event.prevendefault();
$("form").attr("action", $(this).attr("href"));
$("form").submmit()
}
*要注意查询次数与翻页的关系,翻页不该该增长查询次数
关于PEP8记录一点pycharm中的Code菜单栏的Inspect Code选项能够检测PEP8规范
git相关的有点多,就不总结到这儿了。
写自定义表单WIZARD部分整整用了一周,此功能是组里一个大神写的,Angular部分写的太猛,而后表单部分字段到前端的把模型类映射到表单类又弃用了Django自带的Widget,细节有些不太懂,因此改的很头疼,不会的时候有两天回家还看文档看到半夜,结果次日直接昏昏沉沉。
后台Angular部分效果以下:
选择右边后添加到左边表单,点击表单后能够编辑此field的一些设置。最后在前台就可以直接出现此表单,填完后提交就多了条记录。
在此推荐一个找bootstrap样式片断的网站:http://bootsnipp.com/. 个人wizard样式就是在这里面输入form wizard找到的。
这里主要作的是将上面每一个字段项可以让用户分组,从而对应起每一步的wizard。
对了,这里有个注意点事外键约束的问题要考虑清楚,好比删除分组但并不能删除其里面的字段,由于能够选择不用wizard显示。可是默认的是要删除的,因此须要设置on_delete=models.SET_NULL
对了,还有个须要注意的是在数据库新加字段最好考虑下后倾向写成null=True,不然出问题后回滚比较麻烦
话说请假回家三天,竟然在来回的火车上基本读完了《锋利的jquery》以及《Test-Driven Development with Python》两本书
喏,待的最后一周的任务,其中dumpdata注意命令应该就是常使用下面的形式了:python manage.py dumpdata store.UserCategory --indent 4 --format json --pks 178,179,... > testdumpdata.json话说我当时看文档不知为什么看漏了--pks参数,就发现无法取出某天特定数据,就用了在.py文件中查询->序列化->再写入文件的方法,其实这个方法挺好,能够写个脚步一次搞定完,可是问题在于可读性,无法达到--indent 4的那种效果。
一个卡的比较久的问题就是用例测试那儿了,因为刚写完单元测试,因此满脑子还在那儿的节奏,写了一大半才发现数据库使用了真实数据库而不是测试数据库,其实文档写的很清楚使用Django.test.LiveServerTestCase的话会在后端8081端口启动一个Django server,可是因为思惟还在那儿这个一眼晃过没有在乎。因此此时不该该再去访问8000端口,如有nginx的upstream server也应该对应改到8081端口(固然,能够本身指定端口号:https://docs.djangoproject.com/en/1.10/topics/testing/tools/)。这样的话才是使用的测试数据库的数据。
还有一个小问题是写server name时不要把前面的http://加入,我图方便,直接从浏览器中copy的,天然多了之,最后发现有之不行。联系下图顺便对应下window.location对象
二:非技术层面的收获
也是不知道为何,这一个月关注的公众号收到的关于性格讨论的不少,加上本身的感觉总结起来大概就是下面几点:
自信,敢于接受新挑战
要有只要步步分析,就必定可以解决问题的信念
严格的作出逻辑分析而且步步求证,必定不能基于假设去求证
三:一些零碎的知识点
这里记录一些碰到过的很傻的一些问题(主要是我基础很差吧),因为没有随手记下,发现遗忘了很多
则在JS中 var sth = {{ sth }};便可转化为JS的object
2. 若把js文件用引入的方式的话,在js文件中就没法获取模板变量了,解决方法是将其写成函数,参数为须要得到的模板变量,这样在template中调用便可。
2. 在Django 测试中post data,若使用json, 并不须要data=json.dumps(data), 写好对应的content_type便可。注意与JS中的微妙区别(js中若是是简单数据的话也不须要,不然最好序列化一下)
3. 修改/host/etcs能够将外部主机绑定到你但愿的主机(通常是绑定到本地127.0.1.1)
4. Django中用ajax post提交表单时别忘记了加csrf_token,这里须要注意的是既能够将之加入到header中,也能够做为data的一部分进行发送,不过前一种更好。经过jquery的.ajax不一样的options能够完成这两种不一样的加入。(注,每一个模板自带变量{{ csrf-token }})
5. 关于显示html, 注意开启{% autoescape on %},如果在js中想获取带html标签的可用safe过滤器。注意js插入时用.html(哈哈,没想到我习惯了写.text()。搞得废了半天劲)
6. Django测试时,如果运行一个测试类,其每一个方法下使用的同一数据的PK是递增的,故注意不要硬编码
7. 关于python的NoneType:http://stackoverflow.com/questions/21095654/what-is-a-nonetype-object
8. 在Django中相比get后再if xx判断存在与否不如使用filter(xxx).exists().
9. 在Django中不要使用.first()去获取,其原理是全取出来,转化为list,再切片取第一个,效率过低
10. 因为js的执行问题(或者是setTimeout等),有很多须要使用到回调函数确保你想要的东西已执行完毕
其实回调函数实质就是传入函数参数,在具体的时间执行
function aha(callback){
//...;
if( callback && type(callback) == "function"){
callback();
}
}
11. 处于浏览器兼容性考虑,最好用jquery而不是JavaScript
12. Angular中同类view要想好究竟是改变url,仍是经过 “变量+ng-if”,仍是经过modal的方式来呈现,各有各的好处
13. 关于在post提交时获取数据时的request.body与request.POST:
咱们习惯了在post提交时从request.POST中提取数据,之前看F12帮助时发现传的都是字典类的数据,我就觉得get与post不一样一点就是get与post提交数据形式不一样,一个是?a=xx&b=xx, 而另外一个是{a:xx, b:xx},直到有一天看到Javascript ajax提交提倡都先使用stringfy函数序列化后上传,结果一看其只能序列化成?a=xx&b=xx的形式,当时就纳闷这样post还如何提交啊?后来发现其实浏览器那样只是为了可读性,实际仍是提交的?...形式(print request.body便可发现),而又因为form提交与ajax提交使用的content-type不一样,因此如果form提交,Django将之转化为了类字典的request.POST, 而ajax中提倡的json格式提交通常后面就反序列化request.body成dict就好了
能够参考这篇博文
14. 因为经常使用一些插件或者是bootstrap,对于其中某个样式想要去改变的话有时会出现失败的状况,主要是由于被其自己写的样式覆盖了,这时经过加入!important能够实现提升优先级,从而不会被覆盖掉。
# 暂时想起来这些
四:离职缘由
每周六天+天天加班+没有任何形式的补助;没有任何相似咖啡机啊什么的东西(没有公司文化,工程师文化)
有点点不鼓励本身去实现一些东西
同事之间除了午餐没什么交流,也没有任何按期互动或者活动什么的。这样的感受就是天天就是拼命干活,没有归属感
在没有归属感的状况下工做压力很大的话真是受不了,忽然间发现彻底没有了生活,来了一个月就没有出过这公司与家这两点,公车和地铁都没上过,活的恍恍惚惚的,每周惟一的期待就是周日去超市逛逛可以多看见几我的,以为有有生气。最终选择了辞职
其实我并不以为加班有什么,反正回家也是看东西学东西,可是以为归属感比较重要。而归属感主要可能来自:产品自己,工程师文化,同事有没有共同爱好(除了工做外的,好比踢足球,哈哈),...
五:感谢
主要感谢主管张哥,虽然人生观不一样,可是这段时间教会了我很多东西,可以相对系统的给我讲一些东西,又鼓励培养我独立解决问题。上面总结的一些东西大多都来自张哥的提醒或者讲解。真的是十分感谢。