收藏!最详细的Python全栈开发指南 看完这篇你还不会Python全栈开发 你来打我!!!

Posted 亓官劼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了收藏!最详细的Python全栈开发指南 看完这篇你还不会Python全栈开发 你来打我!!!相关的知识,希望对你有一定的参考价值。

Python Web全栈开发入门实战教程教程

   大家好,我叫亓官劼(qí guān jié ),这个《Python Web全栈开发入门实战教程教程》是一个零基础的实战教程,手把手带你开发一套系统,带你了解Python web全栈开发。写这篇文章的初衷就是想给想入门Python Web开发还没入门的小伙伴们一个详细的,真正零基础的一个开发教程,可以让小伙伴们在入门的途中少走很多弯路。
   在服务端端开发上,主流还是Java开发,Python的话虽说开发快速、便捷,但是在一些地方还是有缺陷的。但是Python Web有一个非常好的优点就是方便、快捷、易学、易用,可以让小伙伴们快速的入门Web开发。
  之前有不少小伙伴来问我,怎么开发Web系统啊?毕业论文的中期检查马上就要来了,我的毕业设计还一动没动,我完全不会Web系统的开发,我该怎么办?,虽说大学四年我们或多或少的都学过各种各样的语音,但是项目开发做的却很少,很多学校开了点项目开发的也,最后也都是上了点理论,开发?那是不可能开发的,最后还是一套试卷定成绩,期末背背就是高分,导致很多小伙伴们到了写毕设的时候,连个简简单单的web系统都不会开发。这篇文章也可以给小伙伴们一个参考吧,如果毕设的时候开发web系统的时候无从下手,可以来尝试一下Python Web,这篇文章将会真正零基础的,每步都进行一个详细的说明,带你完成一个小项目,实现各种各样的一个功能,给你提供一些思路。
  写这篇文章的另一个初衷就是,想给想入门Python Web开发的同学或者想学习Web开发的同学,提供一个练手的项目,一套完整的项目实现过程,避免刚入门时的茫然无措。我当时大二刚刚开始做Web开发时,由于学校里面做开发的比较少吧,自己一个人摸索,找网上的各种教程,在教程里他们总是会忽略一些细节,然后我实践运行的时候就是频频报错,一个小小的BUG就要折腾很久,还记得当时项目完成,部署到CentOS服务器上的时候,使用的nginx+UWSGI进行部署,当时直接跑UWSGI可以跑,直接跑Nginx也可以,两个加起来就是一直错误,各种百度、谷歌,也找不到问题所在,最后折腾了半个月,在一篇很小的文章上看到了UWSGI的一个接口文件(安装的时候不是自动生成的,需要自己创建),然后一个很小的bug吧,折腾了半个月。所以这篇文章,也是想给刚入门的小白提供一个参考,一个少走弯路的方法吧!
大家一起加油,时光荏苒,未来可期!


  大家好,我是亓官劼(qí guān jié ),在【亓官劼】公众号、CSDN、GitHub、B站、华为开发者论坛等平台分享一些技术博文,主要包括前端开发、python后端开发、小程序开发、数据结构与算法、docker、Linux常用运维、NLP等相关技术博文,时光荏苒,未来可期,加油~
  如果喜欢博主的文章可以关注博主的个人公众号【亓官劼】(qí guān jié),里面的文章更全更新更快。如果有需要找博主的话可以在公众号后台留言,我会尽快回复消息,其他平台私信回复较慢。

由于学习工作的需要,算法刷题将会逐渐由C++向Python3过度,正在过度中,如实现的不太优美,请见谅。

本文原创为【亓官劼】(qí guān jié ),请大家支持原创,部分平台一直在恶意盗取博主的文章!!! 全部文章请关注微信公众号【亓官劼】。


  写在最前面,本教程为小白教程,很多进阶的内容都没有做添加,后期项目会添加很多需要的功能,届时会放到文章的最后,或者在Flask专栏中,有需要的可以自取,或者看其他的文章,文档也一样。例如现在登录时的图像验证码功能的文章已在专栏中发布,有需要的可以自己添加。本文章截止目前11.7万字,中有一般的代码,所有代码都是实时运行通过的。
  本文原创为CSDN博主亓官劼,原文链接为:收藏!最详细的Python全栈开发指南 看完这篇你还不会Python全栈开发 你来打我!!!,请大家支持原创,拒绝抄袭。

博主的站内博客导航:博客文章内容导航(实时更新)
更多精彩博客文章推荐


本篇文章目录

  如果嫌本篇文章太长,不好拉动的话,可以使用上面的目录今天跳转,或者查看博主之前分篇幅写的博客,相对简短一些,博客地址为:


  本文原创为CSDN博主亓官劼,原文链接为:收藏!最详细的Python全栈开发指南 看完这篇你还不会Python全栈开发 你来打我!!!,请大家支持原创,拒绝抄袭。

一、开发环境 & 项目简介

本项目源码在GitHub上进行开源,本项目的GitHub地址为:OnlineForumPlatform,大家可以去clone全部源码,喜欢的话,也欢迎大家star一下。
   我们这里使用的是Python Web的Flask框架进行开发,使用的集成开发环境为Pycharm,使用的开发语言为Python3,前端为html/CSS/javascript/Bootstrap,数据库为mysql,使用SQL语句进行描述。
  我们这次实战采用的项目是一个在线论坛系统,字如其名,就是开发一个在线的论坛系统。需要实现各个的功能如下:

  • 注册:注册账号
  • 登录:登录账号进入系统,如果登录普通用户,则只有普通用户的权限,如果是管理员账号,则有管理员账号权限。
  • 查看论坛问题列表:查看在线论坛系统中所有已发布的问题.
  • 发布问题:
    • 发布自己的问题,等待他人回答
    • 支持富文本输入
    • 支持Markdown输入
  • 问题详情页面:显示当前问题的讨论、回复。
  • 回答问题:回答他人问题。
  • 个人中心:
    • 显示个人账号信息
    • 可以修改个人账号信息
    • 显示个人发帖情况
  • 资源专区
    • 查看资源列表(已有资源)
    • 在线预览资源
    • 下载资源
    • 上传资源
        项目目前所涉及的功能就是这些,同时还有一些网页安全的一些措施,例如对访问客户的过滤等等功能。这就是我们这个实战项目的一个大致的功能介绍。

博主的站内博客导航:博客文章内容导航(实时更新)
更多精彩博客文章推荐

二、新建一个Flask项目

  既然是开发项目,我们第一步当然是先新建一个项目啦!本来打算第一章写我们的Flask基础知识部分,但是又怕有的小伙伴不会创建我们的Flask项目,索性我们就保姆式教学到底,我们从新建项目开始。

2.1 创建项目

这里使用Pycharm专业版作为开发工具,如果还没有Pycharm的同学可以下载安装一个,如果没有激活的话,可以查看一文教你如何白嫖JetBrains全家桶(IDEA/PtChram/CLion)免费正版

这里选择Flask项目,我这里的项目名称为OnlineForumPltform,使用virtualenv虚拟环境,模板引擎为Jinja2。

这样一个Flask基本项目就创建好啦。创建完成之后页面为这样:

我们点击运行,测试一下第一个hello world:

运行之后,我们访问运行栏中的地址,默认的地址为:http://127.0.0.1:5000
页面返回Hello World!就表示我们第一个已经完成了第一步!

下面我们来创建一些我们下面开发所需要的文件和文件夹。

还有requirements.txt文件是存放本项目所有插件和版本信息的文本,README.md文件是本项目的说明文件。

  本文原创为CSDN博主亓官劼,原文链接为:收藏!最详细的Python全栈开发指南 看完这篇你还不会Python全栈开发 你来打我!!!,请大家支持原创,拒绝抄袭。

2.2 安装本项目所需要的一些插件

点开设置,进行安装插件:

点击+进入添加插件页面,这里我们先添加一个PyMysql,其他的等我们需要的时候再进行添加。

2.3 创建数据库

这里我们先创建一个空的数据库,然后我们使用PyCharm连接这个数据库,方便我们后面进行数据库相关的操作。
(我这里是mac系统,mysql只安装了命令行版本,如果是安装图像界面版本的可以直接进行创建).终端进入mysql的命令为mysql -u root -p然后输入密码即可进入。

Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \\g.
Your MySQL connection id is 8
Server version: 8.0.16 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.

mysql> create database OnlineForumPlatform;
Query OK, 1 row affected (0.06 sec)

mysql>

即可创建成功。

创建完成之后我们使用PyChram来连接数据库。

选择mysql数据库,然后我们填写用户名root和密码,然后填写创建的数据库名称即可,填写完成之后点击测试连接

测试连接正确之后,我们点击OK即可

然后我们在pycharm右面的Database就可以看到我们的数据库了

  好了,到目前为止我们项目所需要的一些基本的插件和数据库都创建完成啦~大家都创建的顺利吗?下面我们先插播一章基础的Flask基础知识讲解,然后就正式的到我们的项目实战环节啦!如果Flask基础知识部分已经了解的,可以直接跳到我们的四,开始我们的项目实战部分啦!在文章顶部有我们文章内的目录,可以直接进行跳转。

  本文原创为CSDN博主亓官劼,原文链接为:收藏!最详细的Python全栈开发指南 看完这篇你还不会Python全栈开发 你来打我!!!,请大家支持原创,拒绝抄袭。


博主的站内博客导航:博客文章内容导航(实时更新)
更多精彩博客文章推荐

三、Flask基础知识部分

  磨刀不误砍柴工,既然是真正的零基础,我们就先来温习一下Flask的一些基础的语法,如果已经了解的这部分的话,可以直接跳到第四章呦~

3.1 Flask程序的基本构造

  首先就是我们的Flask程序的一个基本构造,我们首先需要从flask模块中导入我们的Flask,这是我们框架的主要模块,然后我们还需要导入我们的render_template,这是用来渲染我们的模板的,将我们的HTML页面返回给请求者。
  在前面我新建的时候已经有一个默认的app.py,是return一个Hello World,各位小伙伴们都运行成功了吗?这里我们返回的是一个Html文件,在这里说一句,我们的HTML文件一般都是存放在我们的templates文件夹中,我们就可以直接在这里返回呦,大家可以创建一个demo.html,然后使用下面这个语看看能否返回你的页面呢?

# 从flask中导入Flask和render_template
from flask import Flask,render_template

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('demo.html')

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

3.2 路由器请求方法限定

  在route的参数中设置method的值,默认是GET方法,但是我们很多涉及到表单的页面为了数据的安全性,我们需要使用POST方法去创建,所以我们这里就需要设置我们的请求方式啦methods=['GET', 'POST'],完整的样例为:

@app.route('/', methods=['GET', 'POST'])
def index():
    return render_template('demo.html')

3.3 动态路由

  有时候我们需要一个动态的参数,然后我们根据参数来返回一个对应的页面,这个时候就需要使用到动态路由啦!例如下面这个路由,他需要一个参数交错name,然后他会返回一个hello + 你输入的name,大家可以测试一下,是不是能正确的返回你的名字。这里当你在王志中只输入http://127.0.0.1:5000/user/则会报错,因为没有输入name参数。

@app.route('/user/<name>', methods=['GET', 'POST'])
def user(name):
    return 'hello '.format(name)

其中参数可以通过类型进行限定,例如:int:name即只接受int类型的参数

3.4 Jinja2模板引擎

  由于我们的Web系统是需要一个动态的网页,可能有部分内容数据是需要计算出来的,或者是从后端服务器的数据库中获取的,所以我们需要使用Jinja2模板引擎来对我们的模板进行一个渲染。在函数中传递参数,在HTML页面中,利用 获取传递的参数,例如我们下面这个例子,在服务器端向前端传输一个变量user_var,其中变量名称为html_var,然后我们在前端进行获取变量,并且显示。需要注意的是我们在传递参数的时候,等号前面的传递的参数名(也就是我们在前端获取的时候所需要使用的名),在等号后面的是我们当地的参数名,也就是服务器中的参数,一般来说,我们两名的命名是一样的。
app.py

from flask import Flask,render_template

app = Flask(__name__)

@app.route('/user', methods=['GET', 'POST'])
def user():
    user_var="程序设计类辅助实验教学平台"
    return render_template('demo3.html', html_var=user_var)

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

demo3.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>This is a Demo3 Page</h1>
<h2>It is only using for test</h2>
这是传输过来的变量: html_var 
</body>
</html>

显示效果:

在模板中注释符号为# #,例如# This is a annotation #

3.4 传参时,列表和字典的使用:

app.py

from flask import Flask,render_template

app = Flask(__name__)


@app.route('/', methods=['GET', 'POST'])
def user():
    user_var="程序设计类辅助实验教学平台"
    list_test=['这是list的1','这是list的2','这是list的3','这是list的4','这是list的5']
    dict_test=
        'name': "这是测试name",
        'key': "这是测试key"
    
    return render_template('demo3.html', html_var=user_var,list_test=list_test,dict_test=dict_test)


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

demo3.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>This is a Demo3 Page</h1>
<h2>It is only using for test</h2>
这是传输过来的变量: html_var <br>
<h2>列表使用:</h2>
 list_test <br>
 list_test.1 <br>
 list_test[2] <br>
<h2>dict使用:</h2>
 dict_test <br>
 dict_test.name <br>
 dict_test['key']<br>
</body>
</html>

页面效果:

3.5 控制语句的使用

在% %中进行写Python控制语句,这里使用的语法规范是Python的,在结束控制的是要使用end例如for命令结束的时候,我们要写一行% endfor %

% for num in list_test %
    % if num > 2 %
     num <br>
    % endif %
% endfor %

  本文原创为CSDN博主亓官劼,原文链接为:收藏!最详细的Python全栈开发指南 看完这篇你还不会Python全栈开发 你来打我!!!,请大家支持原创,拒绝抄袭。

3.6 过滤器的基本使用

 var_test|upper 

常见的过滤器

过滤器名说明
safe渲染时不转义
capitalize把值的首字母大写,其余小写
lower把值转换成小写形式
upper把值转换成大写形式
title把值中每个单词的首字母都转换成大写
trim把值的首位空格去掉
striptags渲染之前把值中所有的HTML标签删掉

3.7 使用flash传递消息

app.py

from flask import Flask,render_template,request,flash

app = Flask(__name__)
app.secret_key='this is a secret key'


@app.route('/', methods=['GET', 'POST'])
def user():
    #request请求对象,包括请求方式,数据等
    #flash需要对内容加密,因此要设置secret_key,做加密消息混淆
    if request.method == 'POST':
        username=request.form.get('username')
        password1=request.form.get('password1')
        password2=request.form.get('password2')
        if not all([username,password1,password2]):
            #return '参数不完整'
            flash('参数不完整')
        elif password1 == password2:
            #return 'true'
            flash("true")
        else:
            #return 'false'
            flash("false")
    return render_template('demo3.html')



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

demo3.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form method="post">
    <label>用户名:</label><input type="text" name="username"><br>
    <label>密码:</label><input type="password" name="password1"><br>
    <label>确认密码:</label><input type="password" name="password2"><br>
    <input type="submit" value="提交"><br>

    % for message in get_flashed_messages() %
         message 
    % endfor %
</form>
</body>
</html>

显示效果:

3.8 使用WTF实现web表单

这里可以使用Flask-WTF扩展也可以直接使用我们HTML的<form>表单,都可以。

3.8.1 WTForms支持的HTML标准字段

字段类型说明
BooleanField复选框,值为True和False
DateField文本字段,值为datetime.date格式
DareTimeField文本字段,值为datetime.datetime格式
FileField文件上传字段
HiddenField隐藏的文本字段
MultipleFileField多文本上传字段
FieldList一组指定类型的字段
FloatField文本字段,值为浮点数
FormField把一个表单作为字段嵌入另一个表单
IntegerField文本字段,值为整数
PasswordField密码文本字段
RadioField一组单选按钮
SelectField下拉列表
SelectMultipleField下拉列表,可选择多个值
SubmitField表单提交按钮
StringField文本字段
TextAreaField多行文本字段

3.8.2 WTForms验证函数

验证函数说明
DateRequired确保转换类型后字段中有数据
Email验证电子邮件地址
EqualTo比较两个字段的值,常用于要求输入两次密码进行确认的时候
InputRequired确保转换类型前字段中有数据
IPAddress验证IPv4网络地址
Length验证输入字符串的长度
MacAddress验证MAC地址
NumberRange验证输入的值在数字范围之内
Optional允许字段中没有输入,将跳过其他验证函数
Regexp使用正则表达式验证输入值
URL验证URL
UUID验证UUID
AnyOf确保输入值在一组可能的值中
NoneOf确保输入值不在一组可能的值中

3.8.3Flask-WTF扩展的安装


在PyCharm中打开Preferences

打开Project选项板


进行Project Interpreter设置

点击添加‘+’,然后搜索Flask-WTF

选择好版本之后,Install Package,拓展包就添加完成了


在项目中导入Flask-WTF

from flask_wtf import FlaskForm

在项目中导入Flaks-WTF的HTML标准字段

from wtforms import StringField看完这篇你一定能掌握Linux

疑惑?人工智能兴起为什么带火了Python,看完这篇你就明白了

“微信支付”的架构到底有多牛逼?看完这篇你就明白了!

小白都能看得懂的教程 一本教你如何在前端实现富文本编辑器

微服务架构复杂吗?全新角度详解,看完这篇你就明白了!

软件测试看完这篇你还不会“接口测试”,你把我吊起来锤!