从零到独自开发一个网站(后端)

2023-11-02

从零到独自开发一个网站(后端)

2015-09-15 16:22:25

本博客采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本博客文章必须也遵循署名-非商业用途-保持一致的创作共用协议

折腾了9个小时终于把服务器架好了,因为uwsgi的不友好,发现了一个比nginx还快的服务器——gunicorn,以前python不易部署,所以被php猛超,但是估计不久, 就是我打python的天下了!!

好了回到整体,其实第一篇博客我想献给这一年的开发经历,把自己走过的坑告诉别人。

后端


在了解后端之前你首先得知道在你打开一个网页时,都发生了什么事。

server

这张图即是用nginx和gunicorn做服务器代理的

如图,通常它经过这几个步骤,首先你发送一个请求(request)给服务器,和服务器说“服务器服务器,给我这个域名下的页面”,一般是get的方法访问的这个网址(url),服务器就会接受你的访问,并得到你的访问信息。

服务器是怎么听得懂你的请求呢,主要是这有一种通用的写法,即是一种协议——HTTP协议,这让每次发送的表头都是有规律的,是可以用程序解析的了,如:

HTTP/1.1 200 OK
Content-Type:text/html
...

那个200是一个状态码,表示成功,4开头的状态码表示浏览器访问的错误如404,5开头的状态码表示服务器错误如502

现在你发送一个请求(request),url是 http://www.aljun.me/about?username=aljun 这里面,http是协议(protocol),aljun.mehostname,这里有个隐含的,一般默认端口( port )为80,/about是path ,然后有一段query的值 username=salamer,这些信息都将交由后端跑的app获取到,就好比你给了一串关键字给搜索引擎,搜索引擎会回复你你要的结果。

后端跑的app


当服务器拿到你的请求url,它就会扔给跑在它上面的一个app,就是一套运行的逻辑,你可以理解为是一个黑箱,你扔给它一个东西它会返回一个东西。下面我用一个最简单的flask程序来给一个后端程序的例子:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
        return 'Hello World!'

if __name__ == '__main__':
        app.run()

好,我来逐句解释这个程序,首先你先初始化一个flask应用,把它传给app(第一,二行),然后你获得一个路由(url)(第四行),这里获得的是 /目录,而那个路由装饰器下面跑的函数就是当访问 / 路径时所用的逻辑,可以看到,它返回一个hello world,最后两句是,使app运行,这是python的一种写法,目的是不被调用

好,我们来运行看看

python app.py

这时你可以打开浏览器输入 `127.0.0.1:5000',会看到

pic

好,一个最简单的网站后端就算完成了。但是这单单只是客户端与服务端的交互,只涉及逻辑,并没有设计数据,现在的网站基本上都有复杂的数据库交互,即是,在运行app时,app会使用 * sql * 语句与数据库交互,获得数据,这时它会打到前端。

MTV


mtv是一种模式,它与mvc相类似,mtv分别指m(models,数据层),t(template,模板层),v(views,逻辑层)

python的web框架基本都是这个套路(django,flask,tornado)他们的作用是把一个后端app的逻辑分开,来更加好的扩展应用,而不像php,jsp那般只是完全渲染,mtv分别的作用:

  • M:定义数据库,一般是用python的orm(如django的orm,或者著名的sqlalchemy)来设计数据库,封装sql语句来创建数据,对app起数据库的 起CRUD(增删查改)的作用
  • T:前端渲染,用来写前端的逻辑,一般可可以嵌套进一些python语句甚至是python函数方法,在python领域里面主流是(jinja2,和mako,连django也在其1.8版本后引进jinja2引擎)
  • V:后端的逻辑,也就是rails里面的controller的作用,他用来调控从数据库里拿哪些数据,以及传什么数据到template,和渲染哪个html文件,重定向等等。

MVC


其实mtv是mvc的一种变种,但是由于mvc在ruby,java等语言上的web框架上大放异彩,很多后端框架都是基于他。

pic

摘自阮一峰老师对mvc的看法:

1.最上面的一层,是直接面向最终用户的"视图层"(View)。它是提供给用户的操作界面,是程序的外壳。

2.最底下的一层,是核心的"数据层"(Model),也就是程序需要操作的数据或信息。

3.中间的一层,就是"控制层"(Controller),它负责根据用户从"视图层"输入的指令,选取"数据层"中的数据,然后对其进行相应的操作,产生最终结果。

后端框架(webframework)


先放上一张框架的排名(摘自http://hotframeworks.com

pic

可以看到,ruby,python之类的动态语言的web后端框架还是相当牛逼的

为什么要使用框架呢,事实上在现在,如果说所有东西全部自己写,那么开发效率将是相当低的,在产品迭代如此之快,o2o甚至做到了一周一次产品迭代,若一个开发团队不能快速的迭代产品将会很快被对手抛弃,被市场抛弃,而框架iu是帮助我们的最好帮手,早期的框架比较乱,但现在一般一个好的框架都是基于一定的好的软件方法学理念如mvc,mvvm之类的。

框架有多快?框架里面的翘楚ruby on rails曾经有一个视频,直播15分钟开发出一个blog。

一下我将讲讲我这大半年使用的一些框架的经验

Django


pic

这个算的上是python的web框架里面的老大了,一直被拿去和rails相比,在quora上面的django vs rails 大战持续了很久,但django确实有很多值得诟病的地方,特别是性能,因为他是一个大而全的框架,几乎什么都有,主要模块包括:django.template,django.orm,django.forms,django.url,django.admin,django.authenticate等等,其中最值得称赞的好像是django自带的admin系统,笔者曾经自己开发过学校一个社团系统,后端就是基于admin系统,省下了我不少的事,但是由于他坚持什么都自己来,所以代码量巨大,看源码几乎是一种很艰难的事情,而它的orm我对他有爱有恨,首先django的orm真的足够简单那,就关系来说,多对多,一对多非常好设计,比起sqlalchemy还要建个关系表,他真的太简单,但这也带来了性能上的下降,其次是他的template系统,最近的1.8更新,终于他放弃了那个已经跑不动的template系统,转向拥抱jinja2,但二者语法还是相当相近。

使用公司:IBM,NASA,instagram,disqus,Pinterest,mozila

FLASK


pic

我的这个博客就是基于flask开发的,flask它自称是个微框架,基于两个库,一个前端渲染库jinja2,一个url库Werkzeug,其他的东西可以自己添加啊,如我这个博客就是加上了wtf,sqlalchemy,pagedowm等的库而开发出来的,flask比起django有很大的自由性,但也意味着你需要自己造很多轮子

使用公司:国内的果壳网,pinterest等

tornado


pic

这是一个可以处理异步的web服务器,有可以拿来写后端框架,自己有一套template,他刚开始是由feedback开发,后来feedback被facebook收购,他转而由facebook开发,facebook的前cto出去创业的quora就是基于tornado写的,而quora的国内版本 知乎 也是基于的tornado,他因为异步带来的效率而大受欢迎。然而笔者并不是很喜欢他那种很java的写法,不过效率的话,最近好像也不能比同样可以异步的nodejs。

使用公司:facebook,quora,知乎

ruby on rails


pic

这就是传说中的框架中的王冠,支撑起了早期的推特,以及一大堆公司,基本上是硅谷那边rails火的一塌糊涂,ruby语言的作者赞其是将ruby的元编程能力发挥到了变态的程度,当时笔者自己按着rails guide写时,完全在很恍惚的状态下,一下子,几行代码,一个博客就出来了,而且代码可复用型极高,语法也很简洁,并且将coffescript,jquery什么的一起囊括,非常吓人,写着非常的爽

全面基于mvc框架,并且天生支持RESTful架构,如果是初创企业非常建议使用

使用公司:推特,github,tumblr,国内的100offer,freewheel以及非常多的公司在自己的领域使用rails开发小的应用

详情:有哪些企业使用rails

nodejs


pic

这个基于谷歌v8的javascript引擎的框架几乎火遍世界,他让javascript不再只是一个前端的脚本语言,而且javascript天生对事件异步的支持也使得用nodejs开发的后端效率非常之高,笔者的nodejs经验不算特别多,但是不是很喜欢那种javascript的语法,国内的话BAT基本都在内部不断的开发基于nodejs的应用,更是nodejs+mongodb+express+angularjs(mean构架)是现在最火的创业公司的技术选型。

使用公司:BAT等等的很多公司

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从零到独自开发一个网站(后端) 的相关文章

  • Max函数比较两数大小 int main调用函数举例 C语言入门

    目录 问题描述 思路 代码实现 其他 问题描述 定义一个Max函数 用来比较两整数大小 并在main函数中调用它 思路 定义Max函数 int Max int x int y return 最大值 在main函数中调用Max函数 int m
  • 小米 红米 Redmi note11 4G 5G 手机解锁BL 秒BL解锁 教程 跳过168小时 selenes evergo线刷机包下载

    红米 Redmi Note 11 5G 手机BL解锁 红米note11 4G 5G 秒解锁BL锁 方法 教程 跳过168小时 新版本 selenes evergo 红米Note11系列版本非常多 从4G开始一直到后面出现的11R 我们常见的
  • 陶瓷电容的ESR-谐振频率去哪儿查?

    B站视频演示 陶瓷电容的ESR 谐振频率去哪儿查 https www bilibili com video BV1wT4y1J7oL from search seid 12386875788285776321 建议使用低ESR的电容 如陶瓷
  • Mybatis分页查询的实现(Rowbounds和PageHelper)

    我们实现查询除了 org junit Test public void test02 SqlSession session MybatisUtil getSession UserDao mapper session getMapper Us
  • Python + Selenium(二十六)模拟手机浏览器

    现在的 IT 以移动互联网为主 所以一般网站系统都会支持移动模式 移动设备与 PC 网页浏览区别最大的就是分辨率 大型网站为了体验使用移动设备访问时都会专门提供移动版本 而其他很多站点也是采用响应式设计 也可以支持移动设备以较好的访问 我们
  • Python项目:外星人入侵(一)

    1 安装Pygame 使用pip模块下载并安装Python包 要安装Pygame 在终端提示符下执行如下命令 下载完成 2 创建Pygame窗口及响应用户输入 新建文件夹 将其保存为alien invasion py 在其中输入以下代码 i
  • EC200U open方案环境搭建

    EC200U open方案环境搭建 1 资源 平台 UIS8910DM 500MHz Cortex A5 频段 LTE Cat 1 上行最大5M 下行最大10M LTE FDD B1 B3 B5 B8 LTE TDD B34 B38 B39
  • centOS 7下无法启动网络(service network start)错误解决办法

    问题描述 打开虚拟机 启动CentOS7 检查网络不通 重启service network restart 不行 报错 报错信息 Restarting network via systemctl Job for network servic
  • R极简教程:R语言和RStudio的安装

    R极简教程 R语言和RStudio的安装 R语言是一种广泛使用的统计分析和数据可视化编程语言 RStudio是一个强大的集成开发环境 IDE 提供了便捷的代码编辑 调试和数据可视化工具 本教程将详细介绍如何安装R语言和RStudio 并提供
  • ng: Can't bind to 'ngModel' since it isn't a known property of 'input'. - Angular 6

    出现的问题 ng Can t bind to ngModel since it isn t a known property of input 解决方法 导入 FormsModule 到 app module ts 如下代码粉色标记 imp
  • C++"char"类型的一些解释

    C char 类型的一些解释 char 类型 char 类型的cin和cout 说明 本文适合初学者阅读 为方便叙述和理解 本文牺牲部分严谨性 本文中的概念 数字 代表整数等日常意义上的数而并非书写符号 char 类型 C 中用char类型
  • DRAM 内存介绍(一)

    参考资料 http www anandtech com show 3851 everything you always wanted to know about sdram memory but were afraid to ask SDR
  • (称重问题)假设你有8个球,其中一个略微重一些,但是找出这个球的惟一方法是将两个球放在天平上对比

    问题描述 假设你有8个球 其中一个略微重一些 但是找出这个球的惟一方法是将两个球放在天平上对比 最少要称多少次才能找出这个较重的球 解答思路 至少要称2次 将8个球分成3份 其中2份每份有3个球 设为A B 剩下一份有2个球 设为C 第一次
  • CSS鼠标特效【动画跟随】

    JS CSS body background 111
  • 从 Twitter 运维技术经验可以学到什么

    没有一个网站的性能像 Twitter 这样这么令人牵肠挂肚 看见那条大鲸鱼总是让人感觉很无奈 Twitter 的运维专家 John Adams 在 Velocity 2009 上做了一篇题为 Fixing Twitter 的技术分享 PDF
  • QML Canvas 保存画布内容

    作者 一去 二三里 个人微信号 iwaleon 微信公众号 高效程序员 不知大家想过没有 我们好不容易在 Canvas 上绘制了各种图形 该如何把它保存起来呢 比如 我们实现了一个画板 当用户制作完成自己的作品之后 是不是要将其保存起来 以
  • 关于keil编译STM32例程出现错误的解决方法

    文章目录 错误示例 我的实际操作一 实际没有解决 我的实际操作二 真相大白 用户名没有修改 还是中文 用户名已经修改 乱码原因 学习经验 错误示例 错误如下所示 OBJ LED axf error L6002U Could not open
  • 基于python的股票客户流失数据分析模型

    目录 1 案例背景 2 2 读取数据 2 3 划分特征变量和目标变量 3 4 模型的搭建和使用 3 5 模型的使用 4 6 ROC曲线对模型的评估 7 7 总结 10 8 参考文献 10 9 致谢 10 1 案例背景 在进行一笔股票交易时候
  • 机器学习库--dlib

    dlib是什么呢 见面了 总要认识一下吧 dlib其实就是一个跨平台的用C 编写的代码库 这个库的机器学习算法和工具可以用来解决现实世界的很多工程问题 它在工业界和学术界有着广泛的应用 主要在机器人 嵌入式设备 手机以及高性能计算设备上有着
  • 当事务遇上分布式锁

    文章目录 1 分布式锁的几种实现方式 2 MySQL使用自带锁进行分布式同步控制 2 1 环境准备 2 2 可重复读下的for update的验证 3 Redis实现分布式锁进行同步控制 3 1 Redisson 3 2 Redisson实

随机推荐

  • Unity Input输入类 手指触摸检测

    在移动设备上 用户通常使用触摸屏来进行交互 Unity提供了Touch类来获取用户的触摸输入 以下代码是获取触摸的一些方法与参数 下面的代码演示了如何检测用户是否在屏幕上触摸了一个手指 在上面的代码中 我们使用了Input touchCou
  • visual studio——快速折叠所有代码和展开所有代码

    1 折叠所有代码 先ctrl m 再ctrl o 这是字母O 2 展开所有代码 先ctrl m 再ctrl l 这是字母L
  • ViewModel 源码设计思路分析

    前言 转眼一年又过去大半了 在2022年 初定了大多计划 搬家 换公司 很多事情都一托再拖 这里分享一篇我在公司内部做的分享文章吧 删除了部分对公司内部代码的探讨 公司中的项目运用到了大量的组件封装 有的是对第三方组件进行二次封装 有的是从
  • STM32 电机教程 6 - 步进电机转动控制

    前言 上一讲给大家介绍了步进电机的基础知识 相信大家对步进电机的基本工作原理有了一定的了解 如果没看上一节内容 可以先看一下 https blog csdn net zhanglifu3601881 article details 1028
  • 《微光与红外成像技术》

    1 绪论 图像就是用任何技术手段 将景物目标重现为二维画面或三维立体图的视觉信息 微光泛指在夜间或在低照度下微弱的光或能量低到不能引起视觉的光 2 人眼视觉的基本理论 人眼的绝对视觉阈值在 1 0 9 l
  • QML MouseArea堆叠时传递组合事件

    有2块MouseArea 上层MouseArea接受press事件而位于其下方的MouseArea接受click事件 click被称为组合事件 2方MouseArea各自接受自己的 互不影响 先上代码 MouseArea id beneat
  • 我的创作纪念日(另外关于所有网盘数据失效的问题请看这里)

    机缘 最初成为创作者的初心 从小就喜欢抄书写便签 经常被别人说傻 你记这些东西有什么用呢 从六岁开始就接触电脑了 奈何喜欢电脑却一直被现实生活打趴下 接触 Linux 接触的比较晚 一五年才知道原来这个世界上真的有只有字符代码界面的系统 那
  • jetson nano基础使用笔记

    1 jetson nano金属外壳安装 两个开关的接线方法如下 需要使用跳线帽连接左边第五和第六个管脚 如果不安装外壳的话 必须将跳线帽拆除才能给主板正常供电 2 jetson nano更换国内源 1 备份初始源 打开终端 ctrl shi
  • React性能优化指南

    React性能优化方法总结 使用React开发的项目 可以从加载性能和运行时性能两个方面进行优化 加载性能优化的目标是让用户更早地看到界面 更早地和应用交互 运行时性能优化目标是降低卡顿 交互更流畅 运行时 1 避免不必要的渲染 我们知道R
  • Kotlin资料

    Kotlin中文官网 https huanglizhuo gitbooks io kotlin in chinese content GettingStarted Basic Syntax html
  • 一个请求经历了什么(一)

    浏览器解析 检查是否合法 解析出相应的协议 域名 端口 路径等 如果没有端口则按协议添加默认端口 判断是否有本地缓存 DNS解析 解析流程 浏览器代理 gt 计算机host gt 局域网DNS服务器 gt 更上层DNS服务器 gt gt 顶
  • 回顾:HTTP/HTTPS/对称加密/非对称加密/session/cookie/token

    HTTP超文本传输协议 通过浏览器和服务器进行数据交互 进行超文本 文字 图片 视频等 传输的规定 规定了超文本传输要遵守的规则 特点 1 HTTP协议是无状态的 每次HTTP请求都是独立的 任何两个请求之间没有必然的联系 当然实际应用种并
  • Docker中安装Jenkins

    本篇主要讲如何在Docker中安装Jenkins 如果Docker未安装 可以先参考上一篇文章进行Docker安装 学习Docker 一 centos系统 Docker 安装与卸载 安装 拉取镜像 docker pull jenkins j
  • 关于Qt控制中边框的显示的一些设置(完善中)

    1 可以通过指定类型来选择一类控件进行设置 QLineEdit background color rgb 255 255 255 border radius 8px border color rgb 0 0 0 border style s
  • Linux中more命令的使用,Linux中more命令使用详解教程

    1 使用权限 所有者 什么是所有者权限 2 使用方式more 参数选项 文件 参数 num 从第num行开始显示 num 定义屏幕大小 为num行 pattern 从pattern 前两行开始显示 c 从顶部清屏然后显示 d 提示Press
  • 如何用 Python 开发一个简单的 blender 插件

    Blender是一款开源的3D建模和动画制作软件 支持Python脚本编写插件 下面是一个简单的Blender插件开发示例 首先 需要安装Blender软件 并确保安装了Python库 可以在Blender软件安装目录下的Python目录中
  • Windows安装Mysql(免安装版)

    Windows安装Mysql8 0 25教程 免安装版 1 下载mysql Mysql官网下载地址 2 配置初始化文件my ini 在根目录 与bin目录同级 下创建my txt文件 将以下内容复制到该文件中 其中mysql的安装目录和数据
  • 想将PPT的文字转换到Word文档?看这一篇就够了!!!

    将PPT的文字转换到Word文档 又到了期末考试复习周呢 一些老师会给我们复习的PPT 为了方便 我们当然会选择把它打印出来 但是看到这么多页的PPT 比如下面这张图就是我们老师给的PPT 我简直震惊 于是开始探索将PPT转化为Word的方
  • 【C++自我精讲】基础系列五 隐式转换和显示转换

    C 自我精讲 基础系列五 隐式转换和显示转换 前言 1 C 的类型转换分为两种 一种为隐式转换 另一种为显式转换 2 C 中应该尽量不要使用转换 尽量使用显式转换来代替隐式转换 1 隐式转换 定义 隐式转换是系统跟据程序的需要而自动转换的
  • 从零到独自开发一个网站(后端)

    从零到独自开发一个网站 后端 2015 09 15 16 22 25 本博客采用创作共用版权协议 要求署名 非商业用途和保持一致 转载本博客文章必须也遵循署名 非商业用途 保持一致的创作共用协议 折腾了9个小时终于把服务器架好了 因为uws