去年年底接到老师任务,要开发一个兰州疫情可视化软件,这里是个小的练手项目,麻雀虽小但是五脏俱全,这里前端采用了React,数据采集用了爬虫,一些框架比如:Selenium和Scrapy,还有就是自然语言处理数据,后端按照老师的推荐采用Eve,但是由于我对于这个框架零基础,因此这里使用了Django,这里我就记录一次完整的Django的学习过程,以及自己的一个开发过程。

1.安装django,安装好了就可以使用了。

pip install django 

2.创建项目
django中项目会有一些默认的文件和默认的文件夹,这里我们先打开终端,进入到一个目录(你想存放项目所在的目录),创建项目。

django-admin startproject mysite
# 执行命令创建项目

创建成功
项目初始文件
这里我没有用Pycharm,而是用的Vscode,对比与终端创建和Pycharm创建,是有一定的区别的,但是终端创建的是标准的,他们的区别在于settings.py里面的TempLates中的'DIRS':[];
如图
Pycharm里面配置了参数,但是默认是没有的,我们暂时可以删除。
tree

3.文件介绍
这里我们介绍一下每个文件是用来干什么的。

manage.py # 项目的管理,启动项目/创建App/数据库管理

mysite  # 项目同名的文件夹
__init__.py 
settings.py # 项目的配置文件 连接数据库...
urls.py # URL和函数的对应关系 
asgi.py # 用来接受网络请求(异步式)
wsgi.py # 用来接受网络请求(同步式)

APP

  • 项目

    • app, 用户管理 [表结构、函数、HTMl模板、CSS]
    • app, 订单管理 [表结构、函数、HTMl模板、CSS]
    • app, 后台管理 [表结构、函数、HTMl模板、CSS]
    • app, 网站 [表结构、函数、HTMl模板、CSS]
    • app, API [表结构、函数、HTMl模板、CSS]
      ...

这里我只创建一个APP,这里用到manage.py,在mysite目录下直接执行该命令:
python manage.py startapp apptest
apptest
├── apptest
│ ├── __init__.py
│ ├── admin.py # 不做修改
│ ├── apps.py # 不做修改 app的启动类
│ ├── migrations # 不做修改 数据库的字段变更记录
│ │ └── __init__.py
│ ├── models.py # 专门对数据库进行操作的
│ ├── tests.py # 单元测试
│ └── views.py # 函数,一般会被urls.py所调用

4.快速编写页面进行测试
确保app已经注册,这里注册一下,打开apptest文件夹,找到apps.py,找到自动创建的类。
apps.py
切换到mysite目录,在settings.py进行注册。
注册app
接下来编写URL和视图函数对应关系 ——urls.py
对应关系
这里view.py中并没有index函数,所以这里我们需要编写视图函数。
编写视图函数

启动项目:
1.通过命令行启动;
python manage.py runserver
2.Pycharmy内置启动方式
启动
报错
/index
3.这里我们再去写一个页面,用户得访问其他的url。
url --> 函数
写函数
url --> 函数
4.render()函数的利用
这里我们在view.py里修改一个函数,调用render()函数,使得读取html文件,并且返回给用户。
这里我们给这个文件命名为"user_list.html",render()会从app目录下的templates文件夹下读取html文件(这里我自动创建了一个文件夹),在该文件夹下面新建一个user_list.html文件。编写HTML代码。
简单编写如下
app目录下去找templates目录下的user_list.html
根据app的注册顺序逐一去他们的templates里面去找,但是每个人写代码的规范不同,他们也可能将templates目录放在根目录下,这样会在settings.py中"DIRS = []" 会有修改:

'DIRS': [os.path.join(BASE_DIR, 'templates')],

这样就会优先去项目的根目录templates目录去找,如果找不到,才会从注册app的顺序在每个目录下的templates目录中寻找。

关于静态文件:
在开发过程中,一般将图片、CSS、JS当做静态文件处理,要添加静态文件,需要首先在app文件夹下面创建static文件夹存放静态文件,比如这里放入一张图片:
图片
这里要在static下创建多个文件夹,把图片放入img文件夹下。
img
加载格式
这里不写成绝对路径,是为了方便以后别的项目的迁移。
static
测试
这里我没有静态文件,于是略显粗糙。

5.模板语法
是指HTML中写一些占位符,由数据对这些占位符进行替换和处理
测试
tpl
测试回显
键和值
回显
这里稍做修改:

    {% for k,v in n3.items %}
  • {{ k }} = {{ v }}
  • {% endfor %}

回显
过程
视图函数的render内部:
1.读取含有模板语法的HTML文件
2.内部进行渲染(模板语法执行并替换数据)
最终得到,只包含HMTL标签的字符串
3.将渲染(替换)完成的字符串返回给用户浏览器

案例:伪联通消息中心
这里如果我不想自己添加数组,或者也不想读取数据库,我可以通过一个简单的爬虫方式为例子来请求网页,得到数据。
新闻数据
这里我们继续修改代码,让其在我们的页面上显现出来。
修改代码
回显

6.请求和响应

请求和响应

def something(request):
    # request 是一个对象,封装了用户通过浏览器发送过来的所有请求相关数据
    # 获取用户请求方式
    print(request.method)
    # 接受参数
    print(request.GET)
    # 通过请求体中传递数据
    print(request.POST)
    # 将字符串内容返回给请求者
    # return HttpResponse("返回内容")
    # 读取HTML的内容再进行渲染(字符串替换)
    return render(request, "something.html",{ "title":"来了,gogogog" })
    # 响应重定向,让浏览器重定向到其他页面
    return redirect("https://www.shirong.ink")

案例:用户登录

编写代码
这里我这么写一个登录功能,然后写一个最简单的form表单。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>用户登录</h1>
    <form method="post" action="/login/">
        {%  csrf_token %} 
        <input type="text" name="user" placeholder="用户名">
        <input type="password" name="passwd" placeholder="密码">
        <input type="submit" value="提交">
    </form> 
</body>
</html>

然后最重要的一句话也是比起flask和Django的一点小区别,这里要加上csrf_token,这一点很重要!!!
这是一个很重要的安全机制。

{%  csrf_token %} 
{%  csrf_token %} 
{%  csrf_token %} 

scrf_token
这里用户除了提交的用户名和密码,还有内部隐含生成的一个值。
HTML
这里继续完善代码加上报错提示:
报错提示
输入错误
但是还是不够完善,这里继续修改HTML文件:
颜色提示
登录成功则重定向
这里还是不够完善,因为我把用户名和密码写死了,这个用户名和密码应该有很多,而不会只有一组,读取数据也应当从数据库去读取。这里后面慢慢完善吧,还有if-else嵌套有点多,两个else可以删除。

7.数据库操作
MySQL数据库 + pymysql

import pymysql

# 1.连接MySQL
conn = pymysql.connect(
    host="127.0.0.1",
    user='root',
    passwd='123456',
    port=3306,
    db='testdb',
    charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

# 2.发送指令
cursor.execute("insert into admin(username,passwd,mobile)
values('shirong','qwe666','888888')")
conn.commit()

# 3.关闭
cursor.close()
conn.close()

Django开发操作数据库更加简单,内部提供了orm框架。
ORM框架
这里需要安装mysqlclient。

pip install mysqlclient

Django最新版本对pymysql支持不是太好,但是支持mysqlclient,这里我们用它。
这里我遇到了报错,这里直接去下载whl的包,然后把它按照自己的版本下载下来。看过一些解决方案,但是不是太给力呀,这里我使用Anaconda(更新源+更新到最新版本)
心态崩了

这里给出一个看似很靠谱的解决方案,但是对我并不适用,我依然被提示报错了!!!
心痛万分!!!
大晚上的心态炸了!

ORM可以帮助我们做两件事
1.创建,修改,删除数据库中的表,(不用写SQL语句)但无法创建数据库
2.操作表中的数据
这里数据库已经创建好了。
数据库
3.Django连接数据库
在settings.py中修改配置
修改配置
这里项目涉及到实际的应用开发,这里我就不公开IP和密码了,自己填上自己的IP和密码即可。
在models.py中添加代码如下:

class UserInfo(models.Model):
    name = models.CharField(max_length=32)
    password = models.CharField(max_length=64)
    age = models.IntegerField()
    
    """
    create table app01_userinfo(
        id bigint auto_increment primary key
        name varchar(32),
        password varchar(64),
        age int
    )
    """

在终端执行命令:

# 使用ORM创建表
python manage.py makemigrations
python manage.py migrate

注意:如果要执行上述命令,要确保自己的app已经注册。
如果要继续添加表,就在前面的modles.py中继续添加class类,编写代码即可。

最后修改:2022 年 01 月 12 日 10 : 03 AM
如果觉得这篇文章不错,不妨赏我碎银几两。