Django之一(简介)

软件开发架构

client-----server架构
browser-----server架构

web服务的本质

1.浏览器的信息流程
	1.) 向浏览器发数据请求
	2.) 服务端接受请求
	3.) 服务端发送数据
	4.) 浏览器渲染
2.http协议
	http协议  明文协议
	https协议 密文协议
	weksocket协议 数据传输为密文
3.http协议的四大特性
	1.) 基于请求响应
	2.) 应用于socket之上的应用层协议
	3.) 无状态 
	4.)/无链接
4.响应状态码
	1xx 服务端正在接受
	2xx 成功 200
 	3xx 重定向
	4xx 报错 403 403
	5xx 服务端内部出错
5.请求数据格式
	请求首行(协议版本 请求方式)
	请求头
	\r\n
	请求体
6.响应数据格式
	响应首行(协议版本 状态码)
	响应头
	\r\n
	响应体

简易的web

import socket

server = socket.socket()
server.bind(('127.0.0.1',8080))
server.listen(5)

while True:
    conn,addr = server.accept()
    conn.recv(1024)
    conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
    conn.send(b'hello world!')

基于wsgiref框架的web

'''
wsgiref做得事情:
	1.接收response信息,并且切割为数组形式
	2.封装响应信息返回
通过wsgiref可以简易将框架分为四个部分:
	1.urls (路由层,指定路由对应的响应视图函数)
	2.views (视图函数)
	3.wsgiref (socket以及Http协议相关)
	4.templates(html文件)
'''
1.wsrigef
from wsgiref.simple_server import make_server
from urls import urls
from views import common


def run(env, response):
    response('200 OK', [])  # 首行,头
    """
    :param env:请求类的数据 字典形式
    :param response: 响应类的数据
    :return: 
    """
    current_passage = env.get('PATH_INFO')
    for url in urls:
        if current_passage == url[0]:
            res = url[1]()
            break
    else:
        res = common()
    return [res.encode('utf-8')]


if __name__ == '__main__':
    server = make_server('127.0.0.1', 8080, run)
    server.serve_forever()

2.urls
from views import *


urls = [
    ('/index', index),
    ('/register', register),
    ('/library', library),
    ('/time', time),
    ('/database',connect_database)
]

3.views
def index():
    return 'index'


def register():
    return 'login'


def common():
    return '4040 error'


def library():
    with open('图书管理员系统.html', 'r', encoding='utf-8') as f:
        return f.read()


def time():
    import datetime
    with open('站位.html', 'r', encoding='utf-8') as f:
        res = f.read()
        res = res.replace('stance', datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
        return res # 替换的数据需要用新的参数接受,而非对原参数的修改


def connect_database():
    from jinja2 import Template
    import pymysql
    # jinja2是前后端交互的模板语法,与python语法十分相识
    """
    user = {...}
    jinja2对字典的操作:
    { user } ==> 拿到字典
    {user.get('拿到字典的值')}
    {user.属性} 
    {user['键名']} 
    for循环
    {%for ... in ...%}
    拿出属性进行操作
    {%endfor}
    
    """
    connect = pymysql.connect(
        host='127.0.0.1',
        port=3306,
        user='root',
        password='123456',
        db='django',
        charset='utf8',
        autocommit=True,
    )
    cursor = connect.cursor(pymysql.cursors.DictCursor)
    sql = 'select * from userinfo'
    cursor.execute(sql)
    data_list = cursor.fetchall()
    with open('table.html','r',encoding='utf-8') as f:
        data = f.read()
    tmp = Template(data)
    res = tmp.render(user_list=data_list)
    return res

动静态网页

'''
动态网页是指:数据的来源是后端以及数据库
静态网页是指:数据的来源是前端写死不会变的
'''

前后端交互的两种方式

'''
1.字符串操作
	html文件本质上就是一串字符串,因此操作的时候可以直接是使用字符串的一些方法来操作
	如先用特定的字符串进行站位,然后再替换
		def time():
    import datetime
    with open('站位.html', 'r', encoding='utf-8') as f:
        res = f.read()
        res = res.replace('stance', datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
        return res # 有新的返回值,替换的数据需要用新的参数接受,而非对原参数的修改
2.模板语法
jinja2
'''

jinja2初识

'''
jinja2是一种模板语法,能够快捷的将后端数据传入前端,并且在前端操作
'''
1.字典操作
后端代码:
	from jinja2 import Template
	dict = {}
	with open.....  # 将前端文件数据传入Template as f:
		tmp = Template(f.read)
	res = tmp.rander(kwargs--->user=dict)
前端代码
	{user.get()}
	{user.['']}
	{user.key}
1.jinja2操作字典
	{user} --字典本身
	{user.get()}
	{user.['']}
	{user.key}
2.jinja2的for循环
{%for .. in ..%}
{{对值得具体操作}}
{{对值得具体操作}}
{{对值得具体操作}}
{%endfor%}
如:
	
	{% for user_dict in user_list %}
	     <tr>
	         <td>{{ user_dict.id}}</td>
	         <td>{{ user_dict.username}}</td>
	         <td>{{ user_dict.password}}</td>
	         <td>{{ user_dict.hobby}}</td>
	    </tr>
	{% endfor%}

python三大主流框架初识

"""
1.django
	优点:大而全
	缺点:笨重
2.flask
	优点:小而精,第三方库丰富
	缺点:依赖第三方库
	越来越像django
3.tornado
	优点:天生异步非阻塞,能够支持高并发。
	缺点:无
"""

Django首次启动注意事项

# 1.注意事项
1.计算机名不能有中文
2.一个pycharm程序中只能有一个项目
3.项目中最好也不要出现中文
4.python解释器尽量3.4~3.6版本
	如果出现错误将,删掉
# 2.安装版本选择
1.x和2.x,3.x出现不兼容问题
首选1.x
# 3.django安装
python install django==1.11.11
重新安装时会自动删除以前的版本

Django的基本操作

# 1.命令行操作
django-admin startproject xxxx  # 创建新的django操作
# 切换到django文件内运行以下
python manage.py runserver # 运行django项目
Python manage.py startapp xxx # 创建APP
# 2.pycharm操作
file -->创建新项目 
1.右上角直接运行django
2.在terminal直接输入完整的命名创建APP(tool run 3.manage.py task 开启补全)
4.edit config 编辑端口等一些参数

应用(app)介绍

'''
django是一款专门开发app的应用
django是整个系统,而app对应着不同的功能
	如:
		用户处理
		销售处理
		等
因此针对不同的功能要创建不同的app	
'''
********************************************
app创建好一定要在settings中注册
# app注册路径
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01.apps.App01Config',
    # app01 直接简写也可以
]
********************************************
书写方式:
	1.app名简称
	2.app.apps.appConfig

djang主要文件

'''
-mysite项目文件夹
	--mysite文件夹
  	---settings.py	配置文件
    ---urls.py			路由与视图函数对应关系(路由层)
    ---wsgi.py			wsgiref模块(不考虑)
  --manage.py				django的入口文件
  --db.sqlite3			django自带的sqlite3数据库(小型数据库	 功能不是很多还有bug)
  --app01文件夹
  	---admin.py			django后台管理
    ---apps.py			注册使用
    ---migrations文件夹		数据库迁移记录
    ---models.py		数据库相关的 模型类(orm)
  	---tests.py			测试文件
    ---views.py			视图函数(视图层)
'''

命令行与pycharm创建的主要区别

'''
1.在python中创建会自动生成templates文件夹存放html文件
并且还会在settings中自动配置好templates的文件夹路径
	TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        # 'DIRS': [str.format(BASE_DIR, '/templates')],
        'DIRS': [os.path.abspath(os.path.join(BASE_DIR,'templates'))],
        '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',
	            ],
	        },
	    },
	]
2.在cmd中创建不会有,需要手动配置
'''

Django返回数据的三种方法

1.HttpResponse
返回字符串数据相关
2.render(response,'文件')
返回html文件
3.redict
跳转到其他的页面
如果是Django项目中的直接加后缀即可
如果是其他网页需要输入全称
from django.shortcuts import render,HttpResponse,redirect

def index(request):
    """

    :param request:请求相关的数据,比wsgiref中的env更好用
   :return:
    """
    return HttpResponse('hello world')


def inner(request):

    return render(request,'here.html')


def renders(request):
    # return redirect('https://www.bilibili.com/')
    return redirect('inner/')

'''
render方法给前端页面传值的两种方法
1.在render(request,'xxx', {'values':需要传入的})  # 精确度高
2.如果变量很多可以直接render(request,'xxx', {'values':locals()#会直接传入函数体的其他变量名}  # 省时间
'''
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值