使用Django创建一份在线简历

一、开篇

去年十二月的时候,我曾跟着追梦人物的Django博客教程葫芦依样,开发出了一个自己的博客Black&White,那时候的我对网站的结构,网站运行的模式懵懵懂懂,只会跟着教程一步步做下去,遇到问题去找解决方案的过程也很艰辛,找不到出现问题的关键点,最后成品做了出来,但因为只是模仿,没能力创新,使得最后自己的博客url是demo.lightl.fun/ , 连二级域名都不会修改。之后几个月因为其他事缠身,也就没继续django的学习。适逢将要毕业,我花了几个月将本科知识全部回顾了一遍,对计算机网络的认识更上一层楼,乘着将要找工作,不如重新实践,利用Django创建一份在线简历。

二、设计思路

由于做过的工程太少,很多时候设计思路只是一个方向,具体实现过程会对需求做各种变动,随机应变吧。

简单的设计思路就是,开始一个Django项目,开始一个新的简历应用,从网上找到前端界面模板,然后作为static文件放到简历应用中,根据模板可以提供的数据输出位置设计模型(数据库),然后生成数据库,存入真实数据,用django提供的数据库接口获得数据,在视图函数中作为参数传给前端界面,再在前端界面中使用模板渲染的方法给传来的数据进行渲染,最后使用nginx部署在公网服务器上,实现在线简历功能。

三、具体实现及遇到的问题

具体实现过程中,参考自强学堂-Django 基础教程以及追梦人物的Django博客教程。此时的实现,会考虑每一步做的意义以及能实现的效果,同时Django已经升级到了2.0.5,而网上教程多集中在1.8,有少许区别,参照自强学堂提出的以及google可以解决,(同时Django2.0.5可以兼容Django1.8创建的项目,但在模型部分有修改)。

先是常规的建立项目,建立应用,添加应用信息到settings.py,给view.py添加一个index方法,给urls.py配置url导向,这里没什么太多可说的。

#JL/settings.py
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','jianli',
]
#JL/urls.py
from django.contrib import admin
from django.urls import path
from jianli import views as jianli_views
urlpatterns = [path('admin/', admin.site.urls),path('', jianli_views.index, name='jianli_view'),#新版url写法更舒服了
]

之后找简历模板,最后选择了简历模板,下载,放入应用的static文件夹中,将index.html放入templates文件夹中,给html文件中指向的css、js位置进行修改,此时出现了第一个渲染的数据base_dir,它指向应用的static文件夹,如果今后移动该文件夹,只需要修改base_dir内容,index.html就可以正常工作。

#jianli/views.py
from django.shortcuts import renderdef index(request):base_dir = "../../static/"return render(request, 'jianli/index.html', {"base_dir":base_dir})

说来惭愧,理应很早就开始的模型设计一直到后面才做到。我先是根据模板能提供显示的内容,写了一些数据放在视图函数中,然后生成一个字典作为render方法参数传递给html界面,然后在html界面中使用{{}}、{%%}等对数据进行渲染,此时的语法参考模板设计者文档,但奇怪的是,jinja2提出的很多语法在我这个项目里行不通,例如数字计算,in语法,当时没想太多,只是让视图函数传递的数据多了很多项,也就是flag值,方便我在html里面选择性渲染。

有一天晚上,觉得视图函数传递的数据很多项只用一次,数据量总体太庞大,而且很多时候我感觉可以使用jinja2的方法进行快捷的处理,比如我可以根据数据id%2的结果给出不同的呈现方式,但必须得用is_single的flag来判断。不胜其烦开始查找资料,才发现django默认使用的是DjangoTemplatesLanguage而不是jinja2。惊了,开始安装jinja2,修改settings.py的templates项以jinja2进行渲染,然后大改html文件,使用%、for—if—语句、if—xxx–in–list语句大幅度的减少了渲染量。

#JL/settings.py
TEMPLATES = [{'BACKEND': 'django.template.backends.jinja2.Jinja2','DIRS': [os.path.join(BASE_DIR,'jianli/templates')],'APP_DIRS': True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',],'environment':'jianli.jinja2_env.environment'},},
]
<!-- 部分修改后html元素 -->
<div class="col-md-6 skill-right "><div class="scrollbar scrollbar1">{% for skill in detail_skills if skill.id in [1,2,4,5] %}{% if loop.index % 2 == 1 %}<div class="more-gds"><div class="col-sm-3 more-left"><span class="{{skill.icon}}" aria-hidden="true"></span></div><div class="col-sm-9 more-right"><h4>关于{{ skill.name }}</h4><p>{{ skill.content }}</p></div><div class="clearfix"></div></div>{% else %}<div class="more-gds yes_marg"><div class="col-sm-9 more-right2"><h4>关于{{ skill.name }}</h4><p>{{ skill.content }}</p></div><div class="col-sm-3 more-left"><span class="{{ skill.icon }}" aria-hidden="true"></span></div><div class="clearfix"></div></div>{% endif %}{% endfor %}                <div class="clearfix"></div></div></div>

其实代码写到这里,效果已经足够了,部署在服务器就成了。但数据明文放在视图函数,显得笨拙,传递的字典构造到手都疼,该转移到数据库了。但这是遇到了第二个问题也是最麻烦的问题。很明显的,这些数据的结构是kv,其中v部分亦可以是列表,(简言之就是符合json传递),将value的列表存于MySQL中,要么考虑多表,主表外键连接,要么将列表转为str存入MySQL主表中,取出来的时候再解回列表。按照这个思路开始了模型的编写。完成了存数据,到了取数据过程,开始复杂,django给出的接口返回的数据是queryset类,可以通过db.objects.values()以字典方式获得数据,然后把刚刚value的列表数据再取出来,这个代码量,处理过程还不如直接存数据到views.py中,而且这个数据库只有一条数据。

退而求其次,既然需要json.dumps(list)和json.loads(str),那么为什么不直接生成一个json文件,直接在views.py中json.load(xx.json)多好,然后就有了如下的代码,瞬间清爽。列表的循环交给jinja2处理。

#jianli/views.py
from django.shortcuts import renderimport json
# Create your views here.
def index(request):    with open('jianli/data.json','r') as f:data = json.load(f)dic = {}for k,v in data.items():dic[k] = vreturn render(request, 'jianli/index.html', dic)

最后开始了部署阶段,继续使用nginx+gunicorn的方式部署应用,这时参考使用 Nginx 和 Gunicorn 部署 Django 博客,完全可行,如果一台服务器多个应用,那就写多个配置,都可以监听80端口,我对于Linux的socket文件不是很了解,只能大概的猜测是根据nginx、guincorn的方法,底层使用sockcet编程的思想接收对网站的访问请求。那么我就可以把demo.lightl.fun改成blog.lightl.fun,多写一个配置即可。这里贴一个nginx配置文件怎么写。

#/etc/nginx/sites-available/cv.lightl.funserver {charset utf-8;listen 80;#服务的域名为 cv.lightl.funserver_name cv.lightl.fun; #所有URL 带有 /static 的请求均由 Nginx 处理,alias 指明了静态文件的存放目录location /static { alias /home/light/sites/fun.lightl.fun/JL/static; }#其它请求转发给 Django 处理。proxy_pass 后面使用了 unix 套接字,其作用是防止端口冲突.location / { proxy_set_header Host $host;proxy_pass http://unix:/tmp/cv.lightl.fun.socket;}
}

四、QA

1、为什么在django中jinja2的语法用不了?

因为django默认使用DTL,需要手动安装jinja2并指定,请参考本文第三节。

2、为什么django无法读取json文件,出现Expecting property name enclosed in double quotes?

json文件是严格的键值对,但值可以有多种写法,请注意json文件中没有多余的逗号(大部分配置文件都喜欢在列表的最后一项添加逗号,但json不可以,影响读取)。

3、为什么nginx启动后,访问网页出现502?

原因很多,总体来说是配置文件没写对,同时也要在服务器上应用内进行一次静态文件收集。(有说是nginx default文件的问题,但我没遇到)。

五、沉思

在这个项目中,主要
- 学到了django框架快速搭建网站的过程,要配置views.py、urls.py
- 学到了django中jinja2如何进行页面的渲染
- 学到了怎么使用nginx+gunicorn部署服务
- 学到了怎么使用django的queryset api来读取数据库数据
- 学到了怎么修改HTML文件、同时对bootstrap有了认识。
同时还有很多不足,例如
- 需求多变,没有确切的实现过程,耽误了一些时间
- 没使用到fabric自动化部署,下次有机会直接上fabric

项目地址:halysl/job-cv

使用Django创建一份在线简历相关推荐

  1. cookie 在线人数列表_前端学习随笔2 在线简历

    ​一 心得体会 今天的任务是利用HTML制作一份在线简历,先不考虑样式,只从结构和语义化方面着手.对于已经有了前端b编程经验的我来说挺简单的,但是我还是当作我是一个刚入门的菜鸟,在学习过程中发现其实还 ...

  2. 面试官在线点评4份留学生简历! 这些坑你中了几个?如何写项目描述才能被大厂发面试?转专业简历该咋写 | 还有优秀简历展示!

    我们给大家展示一下 从材料的准备 也就是说到底包含哪些具体的项目 为什么说这些项目是不错的 第二呢就是说在陈述上 在整个这个简历的结构 他的完备性他的准确性 他的正确性 以及最后他的具体的这种项目的描 ...

  3. 赛效:超级简历在线简历助手教您一键制作简历

    在找工作时,一份优秀的简历可以给你的阅历增添不少风采,很多求职者在应聘之前都会制作精美的简历,简历要怎么写更好呢?超级简历在线简历助手,可在线帮助大家设计简历,下面小编来手把手教您使用超级简历来制作个 ...

  4. HTML练习--做一个在线简历

    学习目标: 1.学习掌握HTML基础知识 2.完成在线简历的制作 学习内容: 1. <h1>~<h6>: HTML 部分标题元素 HTML元素<h1>~<h6 ...

  5. 一份技术简历是如何搞定BAT的面试官?

    字体怎么好看点?格式怎么好看点?排版怎么好看点?这些真的有用吗,你认为HR真的会看这些吗,NO.然而这并没有什么卵用. HR基本上都会有一项神技能,那就是如何在13秒内甄别一份简历是否合适. 简历看得 ...

  6. Django创建项目

    安装Django pip install Django Django 创建第一个项目 Django 管理工具 安装 Django 之后,您现在应该已经有了可用的管理工具 django-admin.py ...

  7. 打造在线简历生成器,让面试官眼前一亮……

    ‍ ‍ 茶已备好,只待君来!感谢关注 前端点线面 (>‿<),本号干货满满:14个门类(100+篇原创)内容--又干又硬.<前端百题斩>pdf--助力薪资double.20+篇 ...

  8. Django 创建第一个项目

    文章目录 Django 创建第一个项目 Django 管理工具 创建第一个项目 视图和 URL 配置 HelloWorld/HelloWorld/views.py 文件代码: HelloWorld/H ...

  9. 百度前端技术学院--零基础--第二天 给自己做一个在线简历吧

    百度前端技术学院–零基础–第二天 给自己做一个在线简历吧 课程目标 通过简单的实践,更加清楚地了解HTML是什么,HTML5是什么.学习基本的HTML标签,理解HTML语义化概念 任务描述 用code ...

  10. 在线电影推荐网 使用Python+Django+Mysql开发技术 在线电影推荐系统 电影网站推荐系统 基于用户、物品的协同过滤推荐算法 个性化推荐算法开发 机器学习、人工智能、大数据分布式开发

    在线电影推荐网 使用Python+Django+Mysql开发技术 在线电影推荐系统 电影网站推荐系统 基于用户.物品的协同过滤推荐算法 个性化推荐算法开发 机器学习.人工智能.大数据分布式开发 Mo ...

最新文章

  1. Function类型
  2. 小程序组件 Vant Weapp 安装
  3. VS2015下OpenGL库的配置
  4. 小米2s回退出厂版本_雷军很高兴,小米出货量升至全球第四
  5. C#垃圾回收机制(GC)
  6. MySQL使用学习使用,mysql学习--基本使用_MySQL
  7. Linux入门笔记——type、switch、help、man、apropos、whatis、info
  8. harmonyos消息服务器,第三方纯HarmonyOS应用太少,你还愿意升级吗?
  9. 信息学奥赛C++语言:最大数max(x,y,z)
  10. python类和对象的定义_python类与对象基本语法
  11. 中国小伙CVPR 18论文遭质疑:同行难复现,要求评议组撤稿
  12. js判断手机端和pc端
  13. 小程序中 wx.navigateTo 页面跳转没有反应?
  14. 对JQuery中Ajax应用与jQuery插件的理解与笔记
  15. 微服务如何拆分,能解决哪些问题?
  16. nginx php多域名配置文件,配置文件,nginx_nginx多站点配置,无法通过域名访问,使用ip访问会跳转到其中一个站点,配置文件,nginx - phpStudy...
  17. 异常处理之Validates struts.xml files for syntactic and reference errors.
  18. android 仿微信来电_仿MIUI、微信来电通知无法解决通知折叠到通知列表
  19. 君越更换初装变速箱油教程
  20. SCI (SSCI) 投稿全过程信件模板一览(Cover letter,催稿信,修改稿及回复,感谢信,询问校稿及校稿信) (转)

热门文章

  1. Kubernetes基础:使用rollout对Deployment进行控制
  2. 编写吃c语言程序步骤,自己做的一个C语言小游戏——吃金子
  3. 软件行业英雄们的离世
  4. 计算机界面无法全部显示,电脑屏幕不能完整显示软件界面怎么处理
  5. Android应用性能剖析全攻略
  6. 全栈很屌?什么是全栈工程师
  7. 温度传感器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  8. android studio字体加粗属性,android textview字体加粗 Android studio最新水平居中和垂直居中...
  9. linux下的.swp文件
  10. java短信验证码功能发送的验证码如何校验_如何实现java手机短信验证功能