当前位置: 首页 > news >正文

wordpress 全站通知网站制作大概多少钱

wordpress 全站通知,网站制作大概多少钱,如何获得网站域名,wordpress门户源码http - 无状态-无法记录是否已经登陆过 #会话保持 – session cookie session – 保存一些在服务端 cookie – 保存一些数据在客户端 session在单独服务器D上保存,前面数个服务器A,B,C上去取就好了,业务解耦。—》》现在都是基于token的验证。 以上是基…

http - 无状态-无法记录是否已经登陆过
#会话保持 – session cookie
session – 保存一些在服务端
cookie – 保存一些数据在客户端

session在单独服务器D上保存,前面数个服务器A,B,C上去取就好了,业务解耦。—》》现在都是基于token的验证。
以上是基于BS架构

API授权
由服务端完全把控
三张表,api_token,app_permission,api_permission
多对多的关系:一个账号(服务端给的)可以有多个url权限,同一个url可以被多个账号授权。

models/user.py

from . import db#API授权表的模型
#多对多的关系  中间表
app_permission = db.Table("app_permission",db.Column("api_id",db.ForeignKey("api_token.id")),db.Column("permission_id",db.ForeignKey("api_permission.id")))
# api_token表
#存放的是授权密钥,以及授权id
class ApiToken(db.Model):__tablename__ = "api_token"id = db.Column(db.Integer, primary_key=True, autoincrement=True)appid = db.Column(db.String(128), nullable=False)secretkey = db.Column(db.String(128), nullable=False)#通过中间表去创建多对多的关系manage = db.relationship("ApiPermission", secondary=app_permission, backref="token")#存放的是授权的url
class ApiPermission(db.Model):__tablename__ = "api_permission"id = db.Column(db.Integer, primary_key=True, autoincrement=True)url = db.Column(db.String(128), nullable=False)method_type = db.Column(db.String(128), nullable=False)

新增了文件,记得一定要“用到”我们的项目,绑定,运行了没有?
在init文件里加入

from . import user

然后生效到数据库里
terminal

flask --app server:sq_app db migrate
flask --app server:sq_app db upgrade

在Python中,如果你想在不改变业务逻辑源代码的情况下添加额外功能,你可以使用以下几种方法:

使用装饰器:装饰器可以在不改变函数或方法代码的情况下,添加额外的功能。例如,你可以使用装饰器来记录函数执行的时间,或者验证函数的输入。

def timing_decorator(func):  def wrapper(*args, **kwargs):  start = time.time()  result = func(*args, **kwargs)  end = time.time()  print(f"{func.__name__} took {end - start} seconds")  return result  return wrapper  @timing_decorator  
def my_function():  # your code here

使用继承:如果你想要在不改变类的方法的情况下添加额外功能,你可以创建一个新的类,继承自原始类,并在新的类中添加额外的方法。

class OriginalClass:  # original methods here  class NewClass(OriginalClass):  def extra_method(self):  # extra functionality here

使用Mixin:Mixin是一种设计模式,它允许你在不修改类的情况下,将额外的功能添加到类中。你可以创建一个Mixin类,其中包含你想要添加的额外方法,然后让这个类继承自原始类。

class MixinClass:  def extra_method(self):  # extra functionality here  class OriginalClass:  # original methods here  class NewClass(OriginalClass, MixinClass):  pass  # NewClass now has all the methods of OriginalClass and MixinClass

使用AOP(面向切面编程):AOP是一种编程范式,它允许程序员将横切关注点(cross-cutting concerns)从它们所影响的业务逻辑中分离出来。这种范式在处理一些“在哪里执行代码”的问题时特别有用,比如日志记录、事务处理、安全检查等。Python的某些库如Aspectlib、Hybrid等支持这种范式。
使用Monkey Patching:Monkey Patching是一种动态(运行时)修改模块或类的技术。使用这种方法,你可以在不修改源代码的情况下添加或改变功能。然而,这种方法应该谨慎使用,因为它可能会导致代码难以理解和维护。

libs/auth.py

from flask import request
from models.user import ApiToken, ApiPermission
from hashlib import md5
# import timedef auth_required(func):def inner(*args, **kwargs):if api_auth():return func(*args, **kwargs)else:return "认证失败"return inner# api授权认证函数  --  函数返回为真表示认证成功
# 哈希算法 -- md5单向加密
def api_auth():params = request.args  # 客户端url传递过来的参数appid = params.get("appid")salt = params.get("salt")  # 盐值sign = params.get("sign")  # 签名timestamp = params.get("timestamp")  # 时间戳# if time.time() - int(timestamp) > 600:#     return Falseapi_token = ApiToken.query.filter_by(appid=appid).first()if not api_token:return False# 验证有没有此url和方法的权限# http://127.0.0.1:8000/v1/monitor   GET#                                /v1/monitor         getif not has_permission(api_token, request.path, request.method.lower()):return False# 获取数据库里的密钥secretkey = api_token.secretkey# 生成服务端的签名# 可以加上时间戳来防止签名被别人盗取,重复访问# user_sign = appid + salt + secretkeyuser_sign = appid + salt + secretkey ##+ timestampm1 = md5()m1.update(user_sign.encode(encoding="utf-8"))# 判断客户端传递过来的签名和服务端生成签名是否一致if sign != m1.hexdigest():# raise AuthFailExceptionreturn Falseelse:return Truedef has_permission(api_token, url, method):# 客户端请求的方法和url# get/v1/monitormypermission = method + url# 获取此api_token对象的所有url权限all_permission = [permission.method_type + permission.urlfor permission in api_token.manage]# ['get/v1/monitor', 'post/v1/monitor']if mypermission in all_permission:return Trueelse:return False

router/product_view/product_api.py

from libs.auth import auth_requiredclass ProductView(Resource):# @装饰器@auth_requireddef get(self, id = None):

api授权流程
1.客户端向服务端申请授权,服务端向客户端提供appid和secretkey,以及加密算法
2.客户端按照服务端提供的信息、算法,生成签名,请求时发送给服务端
3.服务端收到信息,验证是否成功

客户端请求代码libs/api_auth_clilent.py

import requests
import random
import hashlibdef calculate_sign(appid, salt, secretkey):user_sign = appid + salt +secretkeym1 = hashlib.md5()m1.update(user_sign.encode(encoding='utf-8'))return m1.hexdigest()length_of_string = random.randint(1, 10)
appid = "sc"
salt = "JD"
secretkey = "123456"sign =calculate_sign(appid, salt, secretkey)url = 'http://127.0.0.1:9000/v1/product'
params = {'appid': appid,'salt': salt,'sign': s ign
}
response = requests.get(url, params=params)
if response.status_code == 200:print(response.json())
else:print(f"请求失败,状态码:{response.status_code}")

运行结果:
在这里插入图片描述
为了更安全,可以加入时间戳

注册登录
models/user.py

"""
@date: 2023/9/16
@file: user
@author: Jiangda
@desc: test"""from . import db
from werkzeug.security import generate_password_hash
import datetime#API授权表的模型
#多对多的关系  中间表
app_permission = db.Table("app_permission",db.Column("api_id",db.ForeignKey("api_token.id")),db.Column("permission_id",db.ForeignKey("api_permission.id")))
# api_token表
#存放的是授权密钥,以及授权id
class ApiToken(db.Model):__tablename__ = "api_token"id = db.Column(db.Integer, primary_key=True, autoincrement=True)appid = db.Column(db.String(128), nullable=False)secretkey = db.Column(db.String(128), nullable=False)#通过中间表去创建多对多的关系manage = db.relationship("ApiPermission", secondary=app_permission, backref="token")#存放的是授权的url
class ApiPermission(db.Model):__tablename__ = "api_permission"id = db.Column(db.Integer, primary_key=True, autoincrement=True)url = db.Column(db.String(128), nullable=False)method_type = db.Column(db.String(128), nullable=False)class User(db.Model):__tablename__ = "userdb"id = db.Column(db.Integer, primary_key=True, autoincrement=True)username = db.Column(db.String(128), nullable = False)_password = db.Column("password", db.String(128), nullable=False)role = db.Column(db.Integer, default=0)add_time = db.Column(db.DateTime, default = datetime.datetime.now)# 属性包装装饰器:python内置装饰器# 作用:把方法当作属性一样使用,定义属性之前做一些检测、转换#@property   #自动根据函数名生成两个装饰器 ==》password.setter password.deletedef password(self):return self._password# user.password()  -->print(user.password)@password.setterdef password(self, value):self._password = generate_password_hash(value)@classmethod  #类方法 第一个参数代表类本身def create_user(cls, username, password):user = cls() #创建实例对象user.username = usernameuser.password = password #调用password.setter装饰的函数,强制性要求存hash值db.session.add(user)db.session.commit()

在这里插入图片描述
在这里插入图片描述

接着,对数据进行校验(密码合法性什么的,有专门的库)
pip install wtforms DataRequired, Regexp, ValidationError

forms/user.py

from wtforms import Form, StringField
from wtforms.validators import DataRequired, Regexp, ValidationError
from models.user import Userclass Userform(Form):username = StringField(validators=[DataRequired()])password = StringField(validators=[DataRequired(), Regexp(r'\w{6,18}', message="密码不符合要求")])#     自定义验证器,验证用户名是否唯一
#     自定义检查字段 方法名:validate_你要检查的字段def validate_username(self, value):if User.query.filter_by(username = value.data).first():raise  ValidationError("用户已存在")

修改router/user/user.py(做了数据校验的版本)

from flask import request
from . import user_bp
from flask_restful import Resource, Api
from models.user import User
from libs.response import generate_response
from forms.user import Userformapi = Api(user_bp)class UserRegister(Resource):
# post方法 -- json  /v1/user# # 没做数据校验的版本(如下)# def post(self):#     username = request.json.get("username")#     password = request.json.get("password")##     if username is not None:#         if password is not None:#             new_user = User.create_user(username, password)#             return generate_response(msg="register success!")#         else:#             return generate_response(msg="register fail!", code=20)#     else:#         return generate_response(msg="no username", code=21)#做了数据校验的版本def post(self):#try:data = request.jsonform = Userform(data=data)if form.validate():User.create_user(username = data.get("username"),password = form.password.data)return  generate_response(msg="注册成功", code=0)else:return generate_response(code=1, msg=form.errors)#except:#return generate_response(code=1, msg="注册失败!")api.add_resource(UserRegister,"/user")

在这里插入图片描述


文章转载自:
http://flyboat.wwxg.cn
http://entreprenant.wwxg.cn
http://unforgiving.wwxg.cn
http://polyantha.wwxg.cn
http://mannite.wwxg.cn
http://scoopful.wwxg.cn
http://pineland.wwxg.cn
http://bivouac.wwxg.cn
http://songkhla.wwxg.cn
http://ayrshire.wwxg.cn
http://pure.wwxg.cn
http://evacuant.wwxg.cn
http://waterguard.wwxg.cn
http://hoosgow.wwxg.cn
http://submetacentric.wwxg.cn
http://chart.wwxg.cn
http://stepbrother.wwxg.cn
http://futuristic.wwxg.cn
http://tropocollagen.wwxg.cn
http://kangting.wwxg.cn
http://unheated.wwxg.cn
http://glochidiate.wwxg.cn
http://collutorium.wwxg.cn
http://macrocephali.wwxg.cn
http://phosphoglyceraldehyde.wwxg.cn
http://profess.wwxg.cn
http://grobian.wwxg.cn
http://tribesman.wwxg.cn
http://nightviewer.wwxg.cn
http://subvert.wwxg.cn
http://paleogeology.wwxg.cn
http://inenarrable.wwxg.cn
http://rattlebrained.wwxg.cn
http://secondi.wwxg.cn
http://plasmolyze.wwxg.cn
http://thinkable.wwxg.cn
http://overstate.wwxg.cn
http://geum.wwxg.cn
http://monniker.wwxg.cn
http://abroad.wwxg.cn
http://ferrozirconium.wwxg.cn
http://arbitrable.wwxg.cn
http://inflationist.wwxg.cn
http://henhouse.wwxg.cn
http://absurdity.wwxg.cn
http://credal.wwxg.cn
http://untearable.wwxg.cn
http://garret.wwxg.cn
http://bumpkin.wwxg.cn
http://uncomely.wwxg.cn
http://cinematograph.wwxg.cn
http://echinococcosis.wwxg.cn
http://unloved.wwxg.cn
http://plateresque.wwxg.cn
http://magisterial.wwxg.cn
http://spearfisherman.wwxg.cn
http://breathhold.wwxg.cn
http://romans.wwxg.cn
http://trusting.wwxg.cn
http://unlearn.wwxg.cn
http://nola.wwxg.cn
http://rhinitis.wwxg.cn
http://biological.wwxg.cn
http://barat.wwxg.cn
http://quizmaster.wwxg.cn
http://almswoman.wwxg.cn
http://quinol.wwxg.cn
http://sweatily.wwxg.cn
http://cosmetology.wwxg.cn
http://batwoman.wwxg.cn
http://coadventure.wwxg.cn
http://houseroom.wwxg.cn
http://cadmus.wwxg.cn
http://praedial.wwxg.cn
http://palestine.wwxg.cn
http://areaway.wwxg.cn
http://anticipative.wwxg.cn
http://mortimer.wwxg.cn
http://agnomen.wwxg.cn
http://dune.wwxg.cn
http://nimrod.wwxg.cn
http://mythogenic.wwxg.cn
http://refreshing.wwxg.cn
http://demonetize.wwxg.cn
http://viraemia.wwxg.cn
http://wardship.wwxg.cn
http://forklift.wwxg.cn
http://quadric.wwxg.cn
http://hydrogel.wwxg.cn
http://nintendo.wwxg.cn
http://hematosis.wwxg.cn
http://nobleman.wwxg.cn
http://forthwith.wwxg.cn
http://mechanist.wwxg.cn
http://diverge.wwxg.cn
http://maintainor.wwxg.cn
http://humming.wwxg.cn
http://commander.wwxg.cn
http://lipopolysaccharide.wwxg.cn
http://lcf.wwxg.cn
http://www.hrbkazy.com/news/83548.html

相关文章:

  • 做网站包括备案吗网络营销软件哪个好用
  • 做网站的流程百科合肥网站快速排名提升
  • 真正做新闻网站软文推广名词解释
  • 哪些企业用wordpress建站站长之家怎么用
  • 在自己电脑建设网站ip域名查询地址
  • 网站开发形式p2p万能搜索引擎
  • 网站建设 开发网站代码广州专门做seo的公司
  • 哪个网站可以做翻译赚钱市场营销的策划方案
  • 淮安汽车网站制作seo怎么才能优化好
  • 优秀作文大全网站网站软件免费下载
  • 德州做网站最新消息新闻
  • 网站建设兼职在哪找重庆百度推广
  • 珠海门户网站制作费用南宁seo外包服务商
  • 医院网站开发违法吗网站推广的全过程
  • 买正品去哪个网站最好常州百度推广代理
  • 关于网站建设外文文献营销网店推广的软文
  • 北京网站建设好不好天关键词搜索量查询工具
  • 网站建设营销外包公司哪家好短视频seo搜索优化
  • 什么是网站建设官方网站怎么注册
  • 检测网站是否正常推广普通话的意义50字
  • 如何申请网站备案号网络推广员每天的工作是什么
  • 百度公司做网站吗广安网站seo
  • 自助建站英文怎么才能让百度收录网站
  • 网站建设与网页制作盒子模型活动推广宣传方案
  • 经营性 网站备案人工智能培训心得
  • 怎么建设一个漫画网站百度推广销售员好做吗
  • 网站快速盈利高级搜索指令
  • 网站建设与管理难不难前端seo优化
  • 建企业网站价格seo网站分析工具
  • 音平商城谁做的网站关键词录入榜