Django---三板斧,静态文件,连接数据库和orm操作

django小白必会三板斧


启动django项目之后如何添加更多的功能?通过之前直接编写的web框架,我们可以知道添加更多的功能可以去编写urls.py和views.py。

django自带重启功能。当识别到项目中代码有变化之后隔段时间会自动重启,但是有时候较慢。

与浏览器打交道的视图函数都应该有返回值,常见的就是下列三个。

HttpResponse---主要用于返回字符串类型的数据 render---主要用于返回html文件,并且支持模板语法(django自己写的) redirect---主要用于重定向,括号内可以写其他网站的全称,也可以自己网站的后缀 案例: def index(request):     return HttpResponse('你好啊 django的学习可容不得半点马虎!!!')     return render(request, 'index.html')     return render(request, 'index.html',{'name':'jason'})     return redirect('https://www.sogo.com') 

登入功能


我们之所以可以在浏览器地址栏中输入不同的路由访问到不同的资源,是因为我们在后端框架中提前开设了相应的访问接口所以用户才能访问。言外之意就是我们没有开设接口,那么肯定访问不到。

1.所以我们想要写登入功能,就应该开设一个接口。

思路:在templates里写一个'login.html'用于登入的页面,然后views.py里写上login的功能函数返回login.html,最后在urls.py创建后缀和函数匹配。

# views,py def login(request):     return render(request,'login.html') # urls.py urlpatterns = [     # url(r'^admin/', admin.site.urls),     url(r'^login/', views.login), ] 

目前是实现了可以通过后缀访问到指定的html页面。

2.登录界面需要使用bootstrap并且还需要自己编写css和js(下面内容以bootstrap为静态文件做例子)

先知道什么是静态文件?

# 编写完成后不会经常被修改的与html页面相关的文件  	css文件、js文件、图片文件、第三方框架文件(bootstrap),上述文件都可以称之为是'静态文件'    	在django中静态文件单独开设一个文件夹存储,默认叫static文件夹,在该文件夹内还可以根据功能的不同继续划分不同的文件,css文件夹,js文件,img文件夹 others文件夹. 

思路:在项目目录下创建一个static的文件存放静态文件,然后创建接口访问static里的静态文件。

知识:理论上应该自己去路由层开设接口资源,但是由于静态文件资源使用频率很高,只要是一个web项目都肯定需要,所以django为了避免开发者繁琐,提供了静态资源的配置文件,只需要填写固定的配置即可开设资源接口。

# 在settings.py最下方 STATICFILES_DIRS = [         os.path.join(BASE_DIR, 'static')     ] # html页面路径 <link rel=stylesheet href=/static/bootstrap-3.3.7-dist/css/bootstrap.min(1).css> 

配置文件中的亮点疑惑:

STATIC_URL = '/static/'  # 作用是什么  /static/是访问静态资源的接口前缀 # 静态文件资源访问接口固定配置 STATICFILES_DIRS = []  # 为什么是列表(用来存储多个元素的)  static是存储静态文件资源的文件夹名称 以该地址为例:/static/bootstrap-3.3.7-dist/css/bootstrap.min.css 1./static/是接口前缀,表示具备访问静态文件资源的权限 2.具备了权限之后会拿着接口前缀后面的文件路径(bootstrap-3.3.7-dist/css/bootstrap.min.css)去列表中每个文件夹中查找 3.找到一个就结束,比如 static和static1里面都有a.txt 那么只会拿到static中的 

动态配置:修改了接口前缀也能访问

{#    <link rel=stylesheet href=/static/bootstrap-3.3.7-dist/css/bootstrap.min(1).css>#}   {% load static %} <link rel=stylesheet href={% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}> 

3.页面需要获取前端用户数据并且传递给后端

思路:通过form表单传递数据。action参数:控制数据的提交地址;method参数:控制请求的提交方式。

<form action= method=post>                 <p>username:                     <input type=text class=form-control name=username></p>                 <p>password:                     <input type=text class=form-control name=password></p>                 <p>hobby:                     <input type=checkbox name=hobby value=111>篮球                     <input type=checkbox name=hobby value=222>足球                     <input type=checkbox name=hobby value=333>网球                 </p>                 <input type=submit value=登录 class=btn btn-success btn-block> </form> 

request对象方法

上述登入功能填写数据提交post请求,默认会报错403。前期不需要过多考虑,直接去配置文件中注释一行即可。

MIDDLEWARE = [     	# 'django.middleware.csrf.CsrfViewMiddleware', 		] 

get请求和post请求都会触发同一个视图函数login的运行。问题:如何针对不同的请求执行不同的代码?

思路:get请求返回一个登录页面,post请求获取用户数据并校验。

解决方式:

# request.method---返回的是纯大写的请求方法字符串 由于get请求更加常见 post请求次之 所以还可以按照下列方式简写 if request.method == 'POST':         return HttpResponse('默默的奋斗才是王道 有了成就才有发言权')     默认让视图函数处理get请求 return render(request, 'login.html') 

如何获取提交的数据?

# 获取post请求提交的普通数据 print(request.POST)  # 结果是一个QueryDict 可以看成字典处理 <QueryDict: {'username': ['aaa'], 'password': ['bbb']}> request.POST.get('username') request.POST.get('password') # get方法获取的是列表里的最后一个元素,想要获取整个列表,使用getlist request.POST.getlist('hobby') # 如何获取url后面携带的数据 request.GET      # 结果是一个QueryDict 可以看成字典处理 request.GET.get('info') request.GET.getlist('info') 

pycharm链接MySQL


pycharm也可以充当很多数据库软件的客户端。

如何进入pycharm的数据库客户端:

  1. pycharm右上方侧边 database
  2. pycharm左下方边角 database
  3. 上述两个地方都没有 需要下载插件 或者直接重装一个正常的pycharm,下载插件settingsplugins搜索database下载apple即可.

我们已mysql为例子。

第一步:选择mysql数据库。

第二步:输入用户名,密码和库名,测试连接(第一次需要下载驱动)

django链接MySQL


django默认自带一个sqlite3数据库,但是功能很少,仅用于本地测试。

1.默认配置

DATABASES = {     'default': {         'ENGINE': 'django.db.backends.sqlite3',         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),     } } 

2.修改配置

DATABASES = {     'default': {         'ENGINE': 'django.db.backends.mysql',         'NAME': 'myzz', # 库名         'HOST': '127.0.0.1', # 本机地址         'PORT': 3306, # 本机mysql端口         'USER': 'root', # 用户名         'PASSWORD': '2231207', # 密码     } } 

3.指定模块

在项目同名的文件夹内的__init__.py,或者应用名的文件夹内的__init__.py,添加一行固定的代码。

import pymysql 		pymysql.install_as_MySQLdb() 

django orm


简介

ORM:对象关系映射

特点:能够让不会写SQL的python程序员使用python语法就可以直接操作MySQL。

好处:提升了开发效率...

坏处:封装了SQL语句,有时候可能效率不高,还需要人为编写SQL调优。

概念对应关系

MySQL ORM
字段 对象的属性
记录 类产生的对象

orm基本使用

1.编写类代码:

class Users(models.Model):     uid = models.AutoField(primary_key=True)  # 等价于uid int primary key auto_increment     name = models.CharField(max_length=32)  # 等价于name varchar(32)     pwd = models.IntegerField()  # 等价于pwd int 

2.执行数据库迁移命令

python3 manage.py makemigrations  # 记录操作 会在migrations文件夹下生成一个类似于日志的文件,记录操作 python3 manage.py migrate  # 将操作迁移到数据库 '''首次执行迁移命令 django还会自动创建一些默认需要使用到的表''' 

3.补充

  1. 迁移数据命令生成的表面的特征是:应用名_类名。由于django支持多个应用,为了区分不同应用下可能会出现相同的表名。
  2. 表的主键可以不写,orm会自动帮你写一个名为id的主键
  3. 每次修改了跟数据库相关的python代码,都需要重新执行迁移命令
  4. 针对两个迁移命令,可以采用pycharm提示功能编写,在tools里的run manage.py task中编写命令即可。

数据操作

user_obj = models.Users.objects.create(name='jack', pwd='333') print(user_obj) print(user_obj.uid) print(user_obj.name) print(user_obj.pwd) 

res = models.Users.objects.filter(name='jason') print(res)  # <QuerySet [<Users: Users object>]> print(res[0])  # Users object print(res[0].uid)  # 1 print(res[0].name)  # jason print(res[0].pwd)  # 123 

models.Users.objects.filter(uid=1).update(name='jasonNB') 

models.Users.objects.filter(uid=3).delete()