python终极篇 --- django 初识

 

1. 下载: 命令行: pip install django==1.11.15 pip install -i 源 django==1.11.15 pycharm settings 解释器 点+号 输入django 选择版本 2. 建立django项目 1. 命令行 cd 保存项目的目录 django-admin startproject 项目名 2. pycharm file ——》 new project ——> 选择django  ——> 选择解释器 ——》 建立django项目 3. 启动项目 1. 命令行: cd manage.py 的目录下 python manage.py runserver # 127.0.0.1:8000
            python manage.py runserver 80 # 127.0.0.1:80
            python manage.py runserver 0.0.0.0:80 # 0.0.0.0:80
        2. pycharm 配置项 点绿色三角启动 4. settings配置 1. 静态文件 STATIC_URL = '/static/'   # 别名
            STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static'), os.path.join(BASE_DIR,'static1'), ] 2. TEMPLATES 模板 HTML文件 DIRS [os.path.join(BASE_DIR, 'templates')] 3. 注释csrf中间件 4. 数据库的配置 5. URL和函数的对应关系 ——> urls.py urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login/', views.login), url(r'^index/', views.index), url(r'^test/', views.test) ] 6. APP 1. 建立APP 1. 命令行 python manage.py startapp app01 2. pycharm tools ——> run manage.py task ——> startapp app01 2. 注册APP 在settings.py中的INSTALLED_APPS写: ‘app01’ 或者 'app01.apps.App01Config'
            
                
    7. 使用MySQL数据库 1. 建立一个MySQL数据库 2. settings的配置: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql',   # 引擎
                    'NAME': 'day66',                        # 数据库名
                    'USER':'root',                          # 用户名
                    'PASSWORD':'',                          # 密码
                    'HOST':'127.0.0.1',                     # IP
                    'PORT': 3306,                           # 端口号
 } } 3. 告诉django使用pymysql模块链接数据库 在settings.py同级目录下的__init__.py中写: import pymysql pymysql.install_as_MySQLdb() 4. 建表 在app01/models.py中写类(继承models.Model) class Userinfo(models.Model): user = models.CharField(max_length=32)  # varchar(32)
                pwd = models.CharField(max_length=32) 5. 执行数据库迁移命令 python manage.py makemigrations # 记录models.py中类是否是有变化 将变化的内容记录下来 
            python manage.py migrate         # 将model的变动同步到数据库中 
            
    8. ORM 对象和关系型数据库的映射 经过操做对象的方式来操做数据库 映射关系; 类 —— 》 数据表 对象 —— 》 数据行 属性 —— 》 字段 ORM能作的事: 操做数据表 操做数据行 ORM操做: from login import models # 获取全部数据
 models.Userinfo.objects.all() ——》 Queryset # 获取一条数据
            models.Userinfo.objects.get(user='alex',pwd='alexdsb') 取不到数据或者取到多条数据的时候报错 # 建立一条数据
            models.Userinfo.objects.create(user='alex',pwd='alexdsb') 9. form表单 1. method='post' action='' 请求方式 提交数据的地址 2. 全部的input的标签要有name属性 3. 有一个input的type=‘submit’ 或者有一个button按钮 10. GET 和 POST GET:获取一个页面 ?key1=v1&key2=v2 POST: 提交数据 11. views.py 写函数 request 跟请求相关的全部内容 request.method 字符串 请示方式 GET/POST request.POST POST请求提交的数据 字典 request.GET GET请求提交的数据 返回值 from django.shortcuts import HttpResponse,render,redirect HttpResponse('字符串')            ——》 页面显示的就是'字符串' render(request,'模板文件名') ——》 渲染你的HTML文件返回给浏览器 redirect('要跳转的URL')         ——》 重定向  告诉浏览器再向URL再发一次GET请求
主要内容归纳

 

 

 

服务端与浏览器收发信息:html

socket 套接字 是应用层和传输层之间一个虚拟层,是一个接口.python

import socket sk = socket.socket() sk.bind(("127.0.0.1", 80)) sk.listen() while True: conn, addr = sk.accept() data = conn.recv(8096) conn.send(b"OK") conn.close() 

 

打印一下收到的消息是什么>???mysql

将\r\n替换成换行看得更清晰点: GET / HTTP/1.1 Host: 127.0.0.1:8080 Connection: keep-alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3355.4 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 Cookie: csrftoken=CtHePYARJOKNx5oNVwxIteOJXpNyJ29L4bW4506YoVqFaIFFaHm0EWDZqKmw6Jm8 

那浏览器收到的消息是什么?web

 

经过以上对比,发现收发消息的格式都是同样的---即为 HTTP协议格式sql

每一个HTTP请求和响应都遵循相同的格式,一个HTTP包含Header和Body两部分,其中Body是可选的。数据库

HTTP响应的Header中有一个 Content-Type代表响应的内容格式。它的值如text/html; charset=utf-8。django

text/html则表示是网页,charset=utf-8则表示编码为utf-8。flask

 

 

  

mport socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(('127.0.0.1', 8000)) sock.listen() while True: conn, addr = sock.accept() data = conn.recv(8096) # 给回复的消息加上响应状态行 
    conn.send(b"HTTP/1.1 200 OK\r\n\r\n") 不加这行代码返回不了数据 conn.send(b"OK") conn.close() 
自定义web框架
""" 根据URL中不一样的路径返回不一样的内容 """  
  
import socket sk = socket.socket() sk.bind(("127.0.0.1", 8080))  # 绑定IP和端口 
sk.listen()  # 监听 
  
while True: # 等待链接 
    conn, add = sk.accept() data = conn.recv(8096)  # 接收客户端发来的消息 
    # 从data中取到路径 
    data = str(data, encoding="utf8")  # 把收到的字节类型的数据转换成字符串 
    # 按\r\n分割 
    data1 = data.split("\r\n")[0] url = data1.split()[1]  # url是咱们从浏览器发过来的消息中分离出的访问路径 
    conn.send(b'HTTP/1.1 200 OK\r\n\r\n')  # 由于要遵循HTTP协议,因此回复的消息也要加状态行 
    # 根据不一样的路径返回不一样内容 
    if url == "/index/": response = b"index"  
    elif url == "/home/": response = b"home"  
    else: response = b"404 not found!" conn.send(response) conn.close() 
根据不一样的路径返回不一样的内容
""" 根据URL中不一样的路径返回不一样的内容--函数版 """  
  
import socket sk = socket.socket() sk.bind(("127.0.0.1", 8080))  # 绑定IP和端口 
sk.listen()  # 监听 
  
  
# 将返回不一样的内容部分封装成函数 
def func(url): s = "这是{}页面!".format(url) return bytes(s, encoding="utf8") while True: # 等待链接 
    conn, add = sk.accept() data = conn.recv(8096)  # 接收客户端发来的消息 
    # 从data中取到路径 
    data = str(data, encoding="utf8")  # 把收到的字节类型的数据转换成字符串 
    # 按\r\n分割 
    data1 = data.split("\r\n")[0] url = data1.split()[1]  # url是咱们从浏览器发过来的消息中分离出的访问路径 
    conn.send(b'HTTP/1.1 200 OK\r\n\r\n')  # 由于要遵循HTTP协议,因此回复的消息也要加状态行 
    # 根据不一样的路径返回不一样内容,response是具体的响应体 
    if url == "/index/": response = func(url) elif url == "/home/": response = func(url) else: response = b"404 not found!" conn.send(response) conn.close() 
根据不一样的路径返回不一样的内容--函数版
""" 根据URL中不一样的路径返回不一样的内容--函数进阶版 """  
  
import socket sk = socket.socket() sk.bind(("127.0.0.1", 8080))  # 绑定IP和端口 
sk.listen()  # 监听 
  
  
# 将返回不一样的内容部分封装成不一样的函数 
def index(url): s = "这是{}页面XX!".format(url) return bytes(s, encoding="utf8") def home(url): s = "这是{}页面。。!".format(url) return bytes(s, encoding="utf8") # 定义一个url和实际要执行的函数的对应关系 
list1 = [ ("/index/", index), ("/home/", home), ] while True: # 等待链接 
    conn, add = sk.accept() data = conn.recv(8096)  # 接收客户端发来的消息 
    # 从data中取到路径 
    data = str(data, encoding="utf8")  # 把收到的字节类型的数据转换成字符串 
    # 按\r\n分割 
    data1 = data.split("\r\n")[0] url = data1.split()[1]  # url是咱们从浏览器发过来的消息中分离出的访问路径 
    conn.send(b'HTTP/1.1 200 OK\r\n\r\n')  # 由于要遵循HTTP协议,因此回复的消息也要加状态行 
    # 根据不一样的路径返回不一样内容 
    func = None  # 定义一个保存将要执行的函数名的变量 
    for item in list1: if item[0] == url: func = item[1] break  
    if func: response = func(url) else: response = b"404 not found!"  
  
    # 返回具体的响应消息 
 conn.send(response) conn.close() 
根据不一样的路径返回不一样的内容--函数进阶版

 

""" 根据URL中不一样的路径返回不一样的内容--函数进阶版 返回独立的HTML页面 """  
  
import socket sk = socket.socket() sk.bind(("127.0.0.1", 8080))  # 绑定IP和端口 
sk.listen()  # 监听 
  
  
# 将返回不一样的内容部分封装成不一样的函数 
def index(url): # 读取index.html页面的内容 
    with open("index.html", "r", encoding="utf8") as f: s = f.read() # 返回字节数据 
    return bytes(s, encoding="utf8") def home(url): with open("home.html", "r", encoding="utf8") as f: s = f.read() return bytes(s, encoding="utf8") # 定义一个url和实际要执行的函数的对应关系 
list1 = [ ("/index/", index), ("/home/", home), ] while True: # 等待链接 
    conn, add = sk.accept() data = conn.recv(8096)  # 接收客户端发来的消息 
    # 从data中取到路径 
    data = str(data, encoding="utf8")  # 把收到的字节类型的数据转换成字符串 
    # 按\r\n分割 
    data1 = data.split("\r\n")[0] url = data1.split()[1]  # url是咱们从浏览器发过来的消息中分离出的访问路径 
    conn.send(b'HTTP/1.1 200 OK\r\n\r\n')  # 由于要遵循HTTP协议,因此回复的消息也要加状态行 
    # 根据不一样的路径返回不一样内容 
    func = None  # 定义一个保存将要执行的函数名的变量 
    for item in list1: if item[0] == url: func = item[1] break  
    if func: response = func(url) else: response = b"404 not found!"  
  
    # 返回具体的响应消息 
 conn.send(response) conn.close() 
返回具体的HTML文件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="x-ua-compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>index</title>
</head>
<body>
<div>这是index页面</div>
</body>
</html>
index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="x-ua-compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>index</title>
</head>
<body>
<div>这是home页面</div>
</body>
</html>
home.html

 

""" 根据URL中不一样的路径返回不一样的内容--函数进阶版 返回独立的HTML页面 """  
  
import socket sk = socket.socket() sk.bind(("127.0.0.1", 8080))  # 绑定IP和端口 
sk.listen()  # 监听 
  
  
# 将返回不一样的内容部分封装成不一样的函数 
def index(url): # 读取index.html页面的内容 
    with open("index.html", "r", encoding="utf8") as f: s = f.read() # 返回字节数据 
    return bytes(s, encoding="utf8") def home(url): with open("home.html", "r", encoding="utf8") as f: s = f.read() return bytes(s, encoding="utf8") def timer(url): import time with open("time.html", "r", encoding="utf8") as f: s = f.read() s = s.replace('@@time@@', time.strftime("%Y-%m-%d %H:%M:%S")) return bytes(s, encoding="utf8") # 定义一个url和实际要执行的函数的对应关系 
list1 = [ ("/index/", index), ("/home/", home), ("/time/", timer), ] while True: # 等待链接 
    conn, add = sk.accept() data = conn.recv(8096)  # 接收客户端发来的消息 
    # 从data中取到路径 
    data = str(data, encoding="utf8")  # 把收到的字节类型的数据转换成字符串 
    # 按\r\n分割 
    data1 = data.split("\r\n")[0] url = data1.split()[1]  # url是咱们从浏览器发过来的消息中分离出的访问路径 
    conn.send(b'HTTP/1.1 200 OK\r\n\r\n')  # 由于要遵循HTTP协议,因此回复的消息也要加状态行 
    # 根据不一样的路径返回不一样内容 
    func = None  # 定义一个保存将要执行的函数名的变量 
    for item in list1: if item[0] == url: func = item[1] break  
    if func: response = func(url) else: response = b"404 not found!"  
  
    # 返回具体的响应消息 
 conn.send(response) conn.close() 
让网页动态起来

 

如下内容目前随便看看就好了,反正我没看懂浏览器

 ============>>>>>>...服务器程序和应用程序<<<<<<<<<=================

对于真实开发中的python web程序来讲,通常会分为两部分:服务器程序和应用程序。服务器

服务器程序负责对socket服务端进行封装,并在请求到来时,对请求的各类数据进行整理。

应用程序则负责具体的逻辑处理。为了方便应用程序的开发,就出现了众多的Web框架,例如:Django、Flask、web.py 等。不一样的框架有不一样的开发方式,可是不管如何,开发出的应用程序都要和服务器程序配合,才能为用户提供服务。

 

这样,服务器程序就须要为不一样的框架提供不一样的支持。这样混乱的局面不管对于服务器仍是框架,都是很差的。对服务器来讲,须要支持各类不一样框架,对框架来讲,只有支持它的服务器才能被开发出的应用使用。

这时候,标准化就变得尤其重要。咱们能够设立一个标准,只要服务器程序支持这个标准,框架也支持这个标准,那么他们就能够配合使用。一旦标准肯定,双方各自实现。这样,服务器能够支持更多支持标准的框架,框架也可使用更多支持标准的服务器。

WSGI(Web Server Gateway Interface)就是一种规范,它定义了使用Python编写的web应用程序与web服务器程序之间的接口格式,实现web应用程序与web服务器程序间的解耦。

经常使用的WSGI服务器有uwsgi、Gunicorn。而Python标准库提供的独立WSGI服务器叫wsgiref,Django开发环境用的就是这个模块来作服务器。

 

wsgiref

咱们利用wsgiref模块来替换咱们本身写的web框架的socket server部分:

  1. """  
  2. 根据URL中不一样的路径返回不一样的内容--函数进阶版  
  3. 返回HTML页面  
  4. 让网页动态起来  
  5. wsgiref模块版  
  6. """   
  7.      
  8. from wsgiref.simple_server import make_server   
  9.      
  10.      
  11. # 将返回不一样的内容部分封装成函数   
  12. def index(url):   
  13.     # 读取index.html页面的内容   
  14.     with open("index.html", "r", encoding="utf8") as f:   
  15.         s = f.read()   
  16.     # 返回字节数据   
  17.     return bytes(s, encoding="utf8")   
  18.      
  19.      
  20. def home(url):   
  21.     with open("home.html", "r", encoding="utf8") as f:   
  22.         s = f.read()   
  23.     return bytes(s, encoding="utf8")   
  24.      
  25.      
  26. def timer(url):   
  27.     import time   
  28.     with open("time.html", "r", encoding="utf8") as f:   
  29.         s = f.read()   
  30.         s = s.replace('@@time@@', time.strftime("%Y-%m-%d %H:%M:%S"))   
  31.     return bytes(s, encoding="utf8")   
  32.      
  33.      
  34. # 定义一个url和实际要执行的函数的对应关系   
  35. list1 = [   
  36.     ("/index/", index),   
  37.     ("/home/", home),   
  38.     ("/time/", timer),   
  39. ]   
  40.      
  41.      
  42. def run_server(environ, start_response):   
  43.     start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ])  # 设置HTTP响应的状态码和头信息   
  44.     url = environ['PATH_INFO']  # 取到用户输入的url   
  45.     func = None   
  46.     for i in list1:   
  47.         if i[0] == url:   
  48.             func = i[1]   
  49.             break   
  50.     if func:   
  51.         response = func(url)   
  52.     else:   
  53.         response = b"404 not found!"   
  54.     return [response, ]   
  55.      
  56.      
  57. if __name__ == '__main__':   
  58.     httpd = make_server('127.0.0.1', 8090, run_server)   
  59.     print("我在8090等你哦...")   
  60.     httpd.serve_forever()  

jinja2

上面的代码实现了一个简单的动态,我彻底能够从数据库中查询数据,而后去替换我html中的对应内容,而后再发送给浏览器完成渲染。 这个过程就至关于HTML模板渲染数据。 本质上就是HTML内容中利用一些特殊的符号来替换要展现的数据。 我这里用的特殊符号是我定义的,其实模板渲染有个现成的工具: jinja2

下载jinja2:

pip install jinja2
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="x-ua-compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Title</title>
</head>
<body>
    <h1>姓名:{{name}}</h1>
    <h1>爱好:</h1>
    <ul>
        {% for hobby in hobby_list %}
        <li>{{hobby}}</li>
        {% endfor %}
    </ul>
</body>
</html>
index2.html文件

使用jinja2渲染index2.html文件:

  1. from wsgiref.simple_server import make_server  
  2. from jinja2 import Template  
  3.   
  4.   
  5. def index(url):  
  6.     # 读取HTML文件内容  
  7.     with open("index2.html", "r", encoding="utf8") as f:  
  8.         data = f.read()  
  9.         template = Template(data)   # 生成模板文件  
  10.         ret = template.render({'name': 'alex', 'hobby_list': ['抽烟', '喝酒', '烫头']})   # 把数据填充到模板中  
  11.     return bytes(ret, encoding="utf8")  
  12.   
  13.   
  14. def home(url):  
  15.     with open("home.html", "r", encoding="utf8") as f:  
  16.         s = f.read()  
  17.     return bytes(s, encoding="utf8")  
  18.   
  19.   
  20. # 定义一个url和实际要执行的函数的对应关系  
  21. list1 = [  
  22.     ("/index/", index),  
  23.     ("/home/", home),  
  24. ]  
  25.   
  26.   
  27. def run_server(environ, start_response):  
  28.     start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ])  # 设置HTTP响应的状态码和头信息  
  29.     url = environ['PATH_INFO']  # 取到用户输入的url  
  30.     func = None  
  31.     for i in list1:  
  32.         if i[0] == url:  
  33.             func = i[1]  
  34.             break  
  35.     if func:  
  36.         response = func(url)  
  37.     else:  
  38.         response = b"404 not found!"  
  39.     return [response, ]  
  40.   
  41.   
  42. if __name__ == '__main__':  
  43.     httpd = make_server('127.0.0.1', 8090, run_server)  
  44.     print("我在8090等你哦...")  
  45.     httpd.serve_forever()  

如今的数据是咱们本身手写的,那可不能够从数据库中查询数据,来填充页面呢?

使用pymysql链接数据库:

复制代码
conn = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="xxx", db="xxx", charset="utf8")
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
cursor.execute("select name, age, department_id from userinfo")
user_list = cursor.fetchall()
cursor.close()
conn.close()
复制代码

建立一个测试的user表:

CREATE TABLE user(
  id int auto_increment PRIMARY KEY,
  name CHAR(10) NOT NULL,
  hobby CHAR(20) NOT NULL
)engine=innodb DEFAULT charset=UTF8;

模板的原理就是字符串替换,咱们只要在HTML页面中遵循jinja2的语法规则写上,其内部就会按照指定的语法进行相应的替换,从而达到动态的返回内容。

 如下内容留存,一些配置信息修改: 重要

 

模板文件配置:

复制代码
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, "template")],  # template文件夹位置
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

 

静态文件配置:

STATIC_URL = '/static/'  # HTML中使用的静态文件夹前缀
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),  # 静态文件存放位置
]

 

刚开始学习时可在配置文件中暂时禁用csrf中间件,方便表单提交测试。

复制代码
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

1. HTTP协议
 
  1. 请求(浏览器发送给服务器的消息-request)
   格式:
    请求方式 URL 协议版本
    k1: v1
    k2: v2
    
    请求数据(请求体)
  
  2. 响应(服务器返回给浏览器的消息-response)
   格式:
    协议版本 状态码 状态描述符
    k1: v1
    k2: v2
    
    响应体(HTML)


 2. web框架
  本质: socket服务端
  
  功能:
   a. socket收发消息
   b. URL和函数的对应关系,根据不一样的URL执行不一样的函数,返回函数的结果
   c. 读取HTML文件,进行了一个字符替换(模板渲染)
  
  分类:
   Django flask tornado
   完成了a,b,c三个功能的  ——》 tornado
   完成了b,c 两个功能     ——》 Django
   完成了b 一个功能       ——》 flask
   
  另外一种分类:
   1. Django  大而全
   2. 其余   短小精悍
 3. 安装Django
  1. pycharm
   file settings project 点加号 输入django 选择版本 下载
   
  2. 命令行
   pip install django==1.11.15
   
 4. 建立Django项目
  1. 命令行
   django-admin startproject 项目名
  
  2. pycharm
   file ——》 new project ——》 django ——》 项目名 ——》选择解释器 ——》create
   
   
 5. 启动Django项目
  1. 命令行
   切换到有manage.py的目录下
   python manage.py runserver     # 127.0.0.1:8000
   python manage.py runserver 80  # 127.0.0.1:80
   python manage.py runserver 0.0.0.0:80  # 0.0.0.0:80
  2. pycharm
   配置好 点绿色三角
   
 6. 配置
  静态文件
   STATIC_URL = '/static/'   # 别名
   STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
   ]

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

1,form表单提交数据注意事项:
   1. input 标签有name属性
   2. action="" method="post"   提交的地方  提交的方式
   3. 有一个input的type="submit"  或者有一个button按钮

  4.注意form标签的位置,提交按钮和输入框必定要在同一个form表单下

2. GET 和 POST 的区别
  1. GET
   1. 获取一个页面
   2. 提交数据    数据显示在URL  ?user=alex&pwd=alexdsb
   
  2. POST
   form表单提交数据   数据不显示

3. 使用MySQL数据库的配置
  1. DATABASES = {
   'default': {
    'ENGINE': 'django.db.backends.mysql', # 引擎
    'NAME': 'day66',                        # 数据库名
    'USER':'root',                          # 用户名
    'PASSWORD':'',                          # 密码
    'HOST':'127.0.0.1',                     # IP
    'PORT': 3306,                            # 端口号
   }
  }
  2. 在与settings.py同级目录下的__init__.py文件中写:
   import pymysql
   pymysql.install_as_MySQLdb()
  
  
  3. 建立表:
   在models.py中写类
   class Userinfo(models.Model):
    user = models.CharField(max_length=32)  # varchar(32)
    pwd = models.CharField(max_length=32)
  
  4. 执行两条命令:
   python manage.py makemigrations    # 把models.py的变化记录下来
   python manage.py migrate           # 去修改你的数据库

 

4. ORM操做
  from login import models
  1.  获取数据表全部内容
   all = models.Userinfo.objects.all()
  2. 获取一条数据
   models.Userinfo.objects.get(user='alex')
   # 没有数据或者多条数据就报错
   
  3. 向数据库插入一条数据
   models.Userinfo.objects.create(user='alex',pwd='alexdsb')
   

补充:  redirect(地址)  跳转到某地址, 若地址是文件,前边不用加 /,如果函数,必须加 /

          建立app,必须在配置文件settings中的  INSTALLED_APPS  中加入app名称

      from django.shortcuts import HttpResponse,render,redirect

          

 

def login(request): if request.method == "POST": age = request.POST.get("age") user = request.POST.get("Userame") pwd = request.POST.get("Password") if age == None: all = models.Userinfo2.objects.all() for i in all: if i.user == user and i.pwd == pwd: print("nihao a ") return redirect("/weixin/") return render(request, "login.html") else: models.Userinfo2.objects.create(user=user, pwd=pwd, age=age) return render(request, "login.html")
登陆注册逻辑代码
相关文章
相关标签/搜索