去年年底接到老师任务,要开发一个兰州疫情可视化软件,这里是个小的练手项目,麻雀虽小但是五脏俱全,这里前端采用了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里面配置了参数,但是默认是没有的,我们暂时可以删除。
manage.py # 项目的管理,启动项目/创建App/数据库管理
mysite # 项目同名的文件夹
__init__.py
settings.py # 项目的配置文件 连接数据库...
urls.py # URL和函数的对应关系
asgi.py # 用来接受网络请求(异步式)
wsgi.py # 用来接受网络请求(同步式)
APP
这里我只创建一个APP,这里用到manage.py,在mysite目录下直接执行该命令: python manage.py startapp 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,找到自动创建的类。
切换到mysite目录,在settings.py进行注册。
接下来编写URL和视图函数对应关系 ——urls.py
这里view.py中并没有index函数,所以这里我们需要编写视图函数。
启动项目: 1.通过命令行启动; python manage.py runserver 2.Pycharmy内置启动方式
3.这里我们再去写一个页面,用户得访问其他的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文件夹下。
这里不写成绝对路径,是为了方便以后别的项目的迁移。
这里我没有静态文件,于是略显粗糙。
5.模板语法 是指HTML中写一些占位符,由数据对这些占位符进行替换和处理
这里稍做修改:
{% for k,v in n3.items %}
{% 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 %}
这里用户除了提交的用户名和密码,还有内部隐含生成的一个值。
这里继续完善代码加上报错提示:
但是还是不够完善,这里继续修改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框架。
这里需要安装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类,编写代码即可。