Code Monkey home page Code Monkey logo

blogdoc's Introduction

BlogDoc

好记性不如烂笔头, 授人以鱼不如授人以渔

我的博文汇总

blogdoc's People

Contributors

erudev avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

blogdoc's Issues

django 学习之浅析类视图、中间件

django

「django 学习」第 2 篇,浅谈类视图、中间件

填坑

接上篇的学生管理系统,对于我们现在的需求来说。我们不必改写为 Class-based View,这里只是演示用法。

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.shortcuts import render
from django.urls import reverse
from django.http import HttpResponseRedirect
from django.views import View
from .models import Student
from .forms import StudentForm


class IndexView(View):
  
  template_name = 'index.html'
  
  def get_context(self):
    students = Student.objects.all()
    context = {
    	'students': students
    }
    return context
  
  def get(self, request):
    form = StudentForm()
    context.update({
    	'form': form
    })
    return render(request, self.template_name, context)
  
  def post(self, request):
	form = StudentForm(request.POST)
    if form.is_valid():
      student = Student()
      student.name = form.cleand_data['name']
      student.sex = form.cleand_data['sex']
      student.profession = form.cleand_data['profession']
      student.email = form.cleand_data['email']
      student.qq = form.cleand_data['qq']
      student.save()
      return HttpResponseRedirect(reverse('index'))
    context.update({
    	'form': form
    })
    return render(request, self.template_name, context)

在代码层面上,代码量明显增多了,但是逻辑上更清晰了,也方便我们日后维护。我们来改写 urls.py,代码如下:

from django.conf.urls import url
from django.contrib import admin
from student import views

urlpatterns = [
    url(r'^$', views.IndexView.as_view(), name='index'),
    url(r'^admin/', admin.site.urls),
]

只是调用了 as_view(),可以简单的理解为把 getpost 做了一层封装,然后做了判断。

使用 Class-based View 可以方便复用,比如项目中,你的逻辑处理都没变,只不过用的模板不一样。那么直接继承,替换模板文件即可。更多的可以参考官方文档: django官方文档

Middleware

中间件是 Django 处理 请求/响应 的钩子框架。它是一个轻巧的低级 “插件” 系统,用于全局改变Django的输入或输出。

在这之前,我们先来看张图:

default

一个 HttpRequest 进来,是从上往下,一层层过滤的。返回 HttpResponse,是从下往上的。
其实跟 Scrapy 的中间件很相似,不过一个是主动发起的 request,比如 Scrapy 中,你想要在发出 request 的时候带上一些必要的请求头,可以这么来写:

import random
from .agents import agents


class UAMiddleware(object):

    def process_request(self, request, spider):
        agent = random.choice(agents)
        request.headers["User-Agent"] = agent

如果把 Scrapy 中重写中间件比作攻击方,那么在 Django 中就好比防守方。下面来看 Stack overflow 的一个例子:

class FilterIPMiddleware(object):
    # Check if client IP is allowed
    def process_request(self, request):
        allowed_ips = ['192.168.1.1', '123.123.123.123', etc...] # 允许的 IP
        ip = request.META.get('REMOTE_ADDR')
        if ip not in allowed_ips:
            raise Http403 # If user is not allowed raise Error 如果用户不再允许的范围内,抛出 Error

       return None

process_request:一个请求来到 middleware 层,进入的第一个方法。一般我们可以做一些检验,比如用户登录,Http 请求头验证之类的。这个方法返回两个值 HttpResponse 或者 None。

关于中间件的其他几个方法,比如 process_responseprocess_exceptionprocess_viewprocess_template_response,并没有仔细的去研究,就不多说了,大家可以自行查看官方文档。

Django + Echarts 实现图表

上周六老大给我布置了这周的任务,现在数据有了。这周要出图表,一个是关于涨幅的, 一个是总额。前端用 echarts,后端用 django

需求

大概列了几点

  1. 前端怎么拿到数据,ajax
  2. 时间控件
  3. echarts 怎么生成图表,双 Y 轴,官方文档
  4. 后端具体怎么处理数据

思路

一开始我是觉得没什么问题的,但是在写代码的过程中,也遇到了不少问题。首先是数据处理,这里我用个简单的例子来说明,因为我拿到的数据是这样的:((a,1),(a,2),(b,1),(b,2)),要转换成 (((a,1),(a,2)),((b,1),(b,2))。这里卡了我很久,死活没想出来。后来请教了群里的朋友,可以用 itertools 下的 groupby ,它会返回一个产生按照 Key 进行分组后的值集合的迭代器。具体的可以看这篇,大佬总结的很详细了 PYTHON-进阶-ITERTOOLS模块小结

下面是我写好的一个接口
qq 20180923160936
之前都不知道什么叫接口,原来这样返回的 json 数据就是。eth 是要显示的右边 Y 轴的数据,下面会说。

前端这块我不太熟,只是照葫芦画瓢写的。纠结的地方就在于双 Y 轴,后来我是把要返回的数据写在一个接口中,也就是我上面说的。eth 用来显示右边的 Y 轴

qq 20180923161231
ajax 请求后端的接口,拿到数据,data[0] 是用来渲染左边的 Y 轴,data[1] 是右边的。遍历拿到数据,填充 x 轴 和 y 轴。x 轴是时间,y 轴的刻度是自动生成的。具体的配置项可以看官方文档 http://echarts.baidu.com/examples/

最后的效果

qq 20180923161835

结语

这篇只是简单的写了些思路,代码写的有点糙,就不放出来了。当然重在实践,好在是写出来了。期间遇到了很多问题,都是自己查文档,google 解决的,也算是一大进步吧。

写给2018

2018

这是我转行以来的第一个总结,也是作为程序员的第一个总结。如果 18 年用两个字来形容,那就是 成长。17 年毕业后,啥也不会,真的是啥也不会,毕业即失业。后来还是家人托关系找的再一家 ERP 公司,做实施。现在想想那时候也不轻松,每天 6 点起,坐两小时去客户公司实施,晚上 8 点多回。不过也很感谢那段经历,毕竟前 20 年过得太舒服,是时候还债了。

去年找工作那一个月,现在都记忆犹新。投简历,海投,没回应,海投,没回应。大概投了 300 多份简历吧,一个月就三个面试机会,好在过了两个。到现在已经工作五个月了,从入职的时候写爬虫,到现在接手量化。成长了很多,但还不够,在这家公司,最大的不足就是写 Python 的就我一个。我不知道自己的水平如何(估计是很菜),每天都在写一些脚本之类的。没有接触到那种真正企业级的项目,19 年继续提升自己,要有危机意识,打算往后端靠。

不足之处

  • 18 年有一个月的时候特别迷茫,想的太多了,迷茫的时候就该多看书 (没毛病)
  • 碎片时间利用率太低
  • coding 的时候不能够集中

2019

Flag

  • 20 本书 (技术 + 非技术)
  • django、flask (深入学习flask)
  • 博客 (两周至少一篇)
  • 完成两个开源项目
  • 学习英语
  • 重新开始跑步(每周至少一次)
  • 减肥 20

django 学习之虚拟环境

django

这是「写点 Python」的第 1 篇,也是「django 学习」第 1篇。

前言

关于学习 django,其实很早之前就开始接触了,只不过那时候只是单纯的学,并没有记录下来。之后打算每周至少更新一篇,主要是自己碰到的问题或者一些比较好玩的点。

这篇是虚拟环境以及一个简单的学生管理系统

虚拟环境

不知道大家用的是不是 anaconda,反正我是。确实 anaconda 对于包管理很方便,不用去考虑那么多,只需要一键安装就可以了。但是吧,最近刚买了一门 django 的课,里面的课程是用的 Python2,所以就想着在自己电脑上基于 Python2 装个虚拟环境。

开始之前,输入 conda env list,可以查看当前系统现有的环境
1

conda create -n py2 python==2.7,-n name,也就是基于 Python2.7 创建一个名为 py2 的环境
conda info --env,可以查看系统下环境的路径,activate C:\anaconda3\envs\py2.7,激活虚拟环境,后面那串就是我电脑上 Python2.7 的路径
2

可以在开始菜单下的 Anaconda3 下的 Anaconda Navigigator 看到 Python 的环境
3

好了,接下来我们就可以基于 Py2 创建虚拟环境了

mkvirtualnev test 新建虚拟环境
pip install django==1.11.2 安装 django
3
至此虚拟环境就装好了

关于如何安装 anacoda,可以大伟的这篇 anaconda

学员管理系统

需求

提供一个学院管理系统,一个前台页面,展示现有学员,并供新学员提交申请,一个后台,能够处理申请。

初始化环境

虽然可以不用创建虚拟环境,就可以直接创建。但是我还是建议在虚拟环境中安装,因为在实际开发中,你可能不止维护一个项目,不同的项目依赖的环境也不同。

好了,选择一个你喜欢的目录,比如 cd C:\Code 下:

  • django-admin startproject stu_manager # 创建项目
  • python manage.py startapp student # 创建应用

编写代码

我们可以在 model 层开始写代码,这是一个简单的需求,只需要一个 model 就可以满足了。

model

接下来编写 admin.py

admin

写完这两个配置,在 settings.py 中的 INSTALLED_APPS 中添加 studentsettings.py 文件:
settings

好了,后台部分就完成了,我们来创建表以及超级用户:

  • python manage.py makemigrations # 生成迁移文件
  • python manage.py migrate # 生成表
  • python manage.py createsuperuser # 创建超级用户

启动项目,python manage.py runserver,接着在浏览器输入 http://127.0.0.1:8000/,会看到一个提示页面。我们可以输入 http://127.0.0.1:8000/admin 进入后台,就可以看到一个后台管理系统了。

基础配置

setting

前台编写

首先我们需要编写 forms.py,代码如下:

forms

接着编写 views.py
carbon 3

最后在 templates 下新建一个 index.html:

carbon 4

说下几个点:

  • StudentForm 中的 clean_<field> 表示自己定义某种方式来校验该字段;
  • class Meta 相当于一种映射(个人理解),fields 指定为 Student 模型类中的字段,也就是我们在前台看到的字段;
  • index 视图,就是先判断是否是 POST 请求,然后校验,如果检验成功,那么就新创建一个 student 对象,赋值,保存。然后重定向到主页。

写在工作一个月

8.6 入职,到现在有一个多月了,趁着周末想写点东西

关于编程

去年这个时候,我还是个小白。虽然说大学是计算机专业的,但是毕竟大学嘛,大家都知道怎么回事。那时候连个 span 标签都没搞懂。记得大概是去年九月底的时候,开始自学 Python,到现在也差不多有一年了。从一开始的 Hello World 到现在算是入门的菜鸟吧。期间有很多乐趣,也有一段时间特别想放弃。相信自学 Python 的,大部分都看过知乎上的一个问题 有多少人按@萧井陌大神给出的Python+Flask路线找到工作了?。我也是这样的,一路上磕磕绊绊,好在没有放弃,也顺利的入职了一家互联网公司,做爬虫。

这一个月来,大概干了这么几件事:

  • 抓取以太坊官网
  • 十几个关于区块链的网站

确实很累,加上公司是 996,每天到家基本都十一点以后了。不过也有点习惯了,我的原则是只要能学到东西,那就完全 ok。虽然公司就我一个写爬虫的,但是技术氛围很好,大家一起讨论技术的时候,那种感觉真的是由内而外的,这正是我向往的。工作一个月,成长肯定是比自学要快的多,虽然现在还是个菜鸟 (逃:

关于自己

我从高中起就不爱说话。

一方面是因为自己的害羞和自卑,一方面可能是没有遇到可以畅聊的人。虽然现在不是那么自卑和害羞,但是还是不太喜欢说话。

有时候觉得自己很了解自己,其实并不是。就拿编程来说,一开始在知乎上看到人家能每天 10+ 学编程,我就觉得自己也可以啊。虽然前一个月我确实也做到了,但后来就不行。有时候真的过分高估自己了,自制力差,没有内在的驱动,大部分只是在写代码,没有深刻的思考。

从去年开始,我开始在微信读书上读书了。上面有一个好友读书时长榜的设定,这个和游戏中打天梯是一样的,很有意思。看的最多的是自传跟个人成长的,不过都没有精读,印象最深的还是雷军传。雷军说过 你写程序有写诗一样的感觉吗?

诚然,现在并没有。我倒是觉得自己写爬虫的时候,每次攻破了一个网站,就像打怪升级一样。

关于未来

未来可能这么定义有点模糊吧,也有点不喜欢这个词。一来一旦用上这个词,就好像把东西推的很远,二来我还没想好什么词来当标题。还两个礼拜就要国庆,打算这期间重新搭一个博客,会把 github 上的同步过去。写博客的初衷,是为了锻炼文笔,记录自己学习成长的过程。也方便以后回看菜鸟的成长史(逃:

既然是写代码,自然技术上是少不了的。列几个计划吧:

  • flask web 开发实战
  • Python3 网络爬虫开发实战
  • 流程的 Python(可以先不看完)
  • 萧大的课程

业余维护自己在 github 上的项目,模拟登陆、爬虫有关的,每周至少去跑一次步。

最后说点有意思的,上个周末去理发,于是有了下面这段对话。

阿姨:小伙子,这头发起码一个多月没剪了吧?
我:下班回来的晚,都没时间。。
阿姨:你是做什么行业的?
我:程序员,写代码的
阿姨:我一猜就知道是 IT 行业,那可得注意,虽然 IT 这一行工资高,但是熬夜很严重。你前额的头发本来就少,千万不能熬夜
我:扎心,我才上了一个月的班。。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.